home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1998 #4 / Amiga Plus CD - 1998 - No. 4.iso / pd / grafik / fvmapmaker / fvmapmaker.readme < prev    next >
Text File  |  1998-01-28  |  67KB  |  2,690 lines

  1. Wednesday 28-Jan-98 10:45:38
  2.  
  3. Copyright:
  4.  
  5. Fictive Map Maker is Copyright © 1997-1998 Valentin Asler / Fictive Reality.
  6. All rights reserved.
  7.  
  8. This software may not be sold for any profit or included on any CD Rom
  9. titles, magazines or any other commercial means of distribution without the
  10. agreement of the author.
  11.  
  12. --
  13.  
  14. Introduction:
  15.  
  16. Fictive Map Maker is a tool with a main use to build 3D scenes and is
  17. especially adapted for games, since it came out of a 3D game project.
  18. Since I didn't find any 3D map/scene editors which would contain everything
  19. needed, for development of a game I started working on, I had to write one
  20. myself. It can load Lightwave objects.
  21. This project was started in summer of 1997.
  22.  
  23. At least MC68030/50MHz recommended for larger scenes.
  24. The FPU version will work much faster, cause of heavy use of floating points.
  25.  
  26. --
  27.  
  28. Contact:
  29.  
  30. Contact me via e-mail at: Valentin.Asler@public.srce.hr
  31.  
  32.            snail mail: Valentin Asler
  33.                Drage Gervaisa 34
  34.                10000 Zagreb, Croatia
  35.  
  36. You can find me also on irc, AmigaNET and IrcNET.
  37. AmigaNET, channel: #Amiga.
  38. IrcNET, channels: #AmyCoders and #AmigaScne.
  39. Nick: Slash^FVR mostly, sometimes Smece and sometimes just plain Slash.
  40.  
  41. Newest updated version you can download from: http://public.srce.hr/~vasler
  42.  
  43. If you encounter any bugs, please send me bug reports via e-mail.
  44.  
  45. --
  46.  
  47. Greetz and thanx:
  48.  
  49. Thanks goes out to people who helped me with this, especially Newlook,
  50. thanx m8.
  51.  
  52. Hiya #Amiga, #AmigaScne, #AmyCoders and everybody I know.
  53.  
  54. --
  55.  
  56. Licence:
  57.  
  58. Fictive Map Maker is a shareware and users are encouraged to register it.
  59. For further information read the file named REGISTER.
  60.  
  61. This tool may be passed on as long as ALL files are included and NONE of
  62. them are changed and no fee is asked for it except the price of media.
  63.  
  64. If you want me to continue the development of this tool, please register.
  65. People who really don't have money may use this tool freely.
  66.  
  67. Registered or not, please send me an e-mail so I know somebody uses it.
  68.  
  69. Thank you for using Fictive Map Maker.
  70.  
  71. --
  72.  
  73. Disclaimer:
  74.  
  75. This software is provided "AS IS" and the author disclaims ALL warranties,
  76. express or implied, including, but not limited to, the implied warranties
  77. of merchantability and fitness for a particular purpose.
  78. The author will not be held liable for any damages caused by use or misuse
  79. of this software.
  80. The author is not in any way required, nor bound to continue development of
  81. this software, nor to correct any encountered bugs.
  82.  
  83. The user of this program uses it at his or her own risk.
  84.  
  85. --
  86.  
  87. Requirements:
  88.  
  89. At least ROM 3.0, 020. (ROM 2.04 maybe, but I'm not sure, try it).
  90.  
  91. --
  92.  
  93. Things to do:
  94.  
  95. Make save-file version which can be easily loaded into 3D engines.
  96. Optimise.
  97. Enhance and finish some options.
  98. Enhance 3D editor.
  99. Enhance 3D view.
  100.  
  101. --
  102.  
  103. Explanation of features:
  104.  
  105. Fictive Map Maker has a 3D editor which is used to construct 3D scenes out
  106. of polygons, objects and fields.
  107. Polygons consist out of 2 main groups: With 3 points and with 4 points.
  108. Objects consist out of polygons and can be connected/"stuck" to main maps and
  109. to fields.
  110. Fields consists out of polygons and objects and can too be "stuck" to main
  111. maps.
  112. Polygons and map fields can have attributes and polygons can have textures.
  113. More than one actions can be joined to objects and points in 3D space.
  114. Monsters can be added to the map.
  115. Maps for now have size from -2 billion to about 2 billion (32bit signed).
  116. Loads Lightwave objects. Explanation how to load them can be found together
  117. with explanation for "Load" gadget.
  118.  
  119. --
  120.  
  121. Explanation of gadgets and editor:
  122.  
  123. The biggest part of the screen is used by 4 areas bordered with black
  124. lines. Left-Down one is a front view. Left-Up is a top view. Right-Down is
  125. a side view. Right-Up is a 3D view. Later to be implemented will be one
  126. huge view which will to users choice display any of those views enlarged.
  127. Small views are 200x200 points and large view will be 400x400 points.
  128. For now user can edit scene in front, top and side views and later 3D.
  129.  
  130. The leftmost display gadgets with X, Y and Z left of them show where on the
  131. editor views mouse is pointing. They are not changed only according to
  132. mouse position, but also to view alignment, zoom factor and view depth.
  133.  
  134. VD gadget is a View Depth input gadget. View Depth tells the display
  135. function how "deep" in front, top and side views it should display, ie. if
  136. a polygon is situated farther than View Depth edge it gets 3D cut.
  137.  
  138. Grid tells the edit function in how large steps it should change
  139. coordinates when scene is being edited with using mouse.
  140.  
  141. MZV is a Move, Zoom Value and it says in how large steps Map Align and/or
  142. Zoom Factor should be changed when using "Move" and "Zoom" button gadgets.
  143.  
  144. P is a value which tells the mouse button read function how precise the
  145. user wants the "point grab" function to be, ie. if the user sets it small,
  146. he will have to pick the points very precisely and if he sets it large, he
  147. won't have to be so precise, but in that case he may accidently choose a
  148. wrong point to grab.
  149.  
  150. ZF is a Zoom Factor input gadget and it sets the size of edit/display
  151. windows to needed one.
  152.  
  153. MA X, Y, Z are the Map Align gadgets.
  154.  
  155. Load and LoadA gadgets are gadgets used when loading, still not fully
  156. finished, so are doing the same operation.
  157. Load gadgets atempt to load a selected object, lets say Poly3 (First Cycle
  158. gadget), from the file you choose. The file you choose must have the same
  159. object as on first cycle gadget. The active item will be overwriten.
  160.  
  161. NOTE: For loading Lightwave objects, you must enter Object editor and
  162. choose "Object" list (first cycle).
  163.  
  164. Save and SaveA gadgets are gadgets used when saving, still not fully
  165. finished, so are doing the same operation.
  166. For now it saves the object you choose, and from active item, to the last
  167. one.
  168.  
  169. Suggested sufixes: .fvm, .fvp3, .fvp4, .fvf, .fvo, .fvmn, .fvmf, .fvmo,
  170. .fvmm, .fvt, .fva, .fvfd, .fvma
  171.  
  172. NOTE: If you find some error in Save and Load functions, please e-mail me.
  173.  
  174. Full, Front, Top, Side MX_KIND gadget is used to set the size of the window
  175. and to set the wanted view. *Not implemented*
  176.  
  177. Editor, M Editor, F editor and O editor MX_KIND gadget is used to set the
  178. editor under which the work is about to be done, explained later.
  179.  
  180. First cycle gadget is used to set the item the operations will be
  181. implemented on. It equals to the lowest MX_KIND gadget. Items expl. later.
  182.  
  183. Buttons left and right of first cycle gadget are used to move along the
  184. list of added items.
  185.  
  186. Two buttons most right of first cycle gadget are used to change the
  187. position of the attribute that is being changed on a chosen item, ie. the
  188. item has 12 attributes and only 8 fit in two columns of input gadgets.
  189.  
  190. N input gadgets. The left most one is used as a number of active item
  191. member and the right one is used for names.
  192.  
  193. Under them, right of X, Y, Z, input gadgets are used to set the values of
  194. some items.
  195. Note that items don't have either same number, either same function of their
  196. attributes.
  197.  
  198. Add gadget is used to add another member of specified item.
  199.  
  200. Delete gadget is used to delete member of specified item.
  201.  
  202. Copy and Paste gadgets are used to copy and paste gadget values. *N/A*
  203.  
  204. Zoom In and Zoom Out gadgets are used to change the Zoom factor value.
  205.  
  206. Up-Down, Left-Right, Forth-Back button gadgets are used to change map
  207. alignment.
  208.  
  209. Second cycle gadget is used to set specific values of some items, ie. set
  210. Map Object to point to a selected Object item.
  211.  
  212. Input gadgets under it state the number and name of member in item list,
  213. ie. Object number and its name.
  214.  
  215. Buttons left and right of second cycle gadget are used to move through the
  216. list of available items.
  217.  
  218. Clear Scene is used to clear the whole scene and all items, not working yet.
  219.  
  220. 3D View checkbox is checked if you want the 3D view to display.
  221.  
  222. Grid checkbox is checked if you want the grid to display.
  223.  
  224. ARed checkbox is an "Auto Redraw" option which is checked when you want the
  225. view to redraw after you press any gadget concerning the view.
  226.  
  227. Zoom and UnZo gadgets are used for graphical zoom. Usage: Press Zoom, use
  228. mouse and left mouse button to surround an area and release the left mouse
  229. button. After that the Zoom Factor and Align[X,Y,Z] changes to the area you
  230. have chosen. Press UnZo to return Zoom Factor and Alignment to the contents
  231. before using the Zoom gadget.
  232.  
  233. Align and UnAl gadgets are used to graphically set the Alignment of the
  234. view. Usage: Press Align, press left mouse button in one of 3 views (except
  235. 3D view). Alignment is not set to the point you chose. Pressing UnZo
  236. button returns the values to previous state.
  237.  
  238. PP, PPP and PPN gadgets are used for picking a polygon to be active. Press
  239. PP and then press on the poly you want to be active, on the display, in
  240. Front, Top and Side views. PPN and PPP are used to pick next and previous
  241. polygons with matching position, and they can be of use when 2 or more
  242. polygons overlap.
  243.  
  244. NOTE: Orange coloured polygons are the ones you chose in the list and have
  245. the priority over other polygons, when moving their points with the mouse.
  246. Poly3s have higher priorities than Poly4s.
  247. SAVE before loading LW objects, cause it dies on some.
  248. It can load only polygons with 3 and 4 points from LWOB file.
  249.  
  250. --
  251.  
  252. First cycle gadget Item explanation:
  253.  
  254. The items will be displayed as their values are input with input gadgets
  255. together with second cycle gadget and common attributes.
  256.  
  257. Map:
  258.  
  259.    ________________
  260.   |       Map      |
  261.   |________________|
  262.    _________________
  263. N | Number |  Name  |
  264.   |________|________|
  265. X |   X    |   X    |
  266.   |________|________|
  267. Y |   Y    |   Y    |
  268.   |________|________|
  269. Z |   Z    |   Z    |
  270.   |________|________|
  271.  
  272. Number value displays number of active Map.
  273. Name is a name of the active Map.
  274. X, Y and Z are coordinates of the Map.
  275. NOTE: Maps can only be changed in Map Editor.
  276.  
  277. Poly3:
  278.    ________________
  279.   |     Poly3      |
  280.   |________________|
  281.    _________________
  282. N | Number |  Name  |
  283.   |________|________|________
  284. X |   X1   |   X2   |   X3   |
  285.   |________|________|________|
  286. Y |   Y1   |   Y2   |   Y3   |
  287.   |________|________|________|
  288. Z |   Z1   |   Z2   |   Z3   |
  289.   |________|________|________|
  290.  
  291.    ________________   ________________
  292.   |     Texture    | |    Attribute   |
  293.   |________________| |________________|
  294.  
  295. Number value displays number of active Poly3.
  296. Name is not used in case of Poly3.
  297. X1, Y1, Z1 are the coordinates of 1. point, X2, Y2, Z2 of 2. and X3, Y3 and
  298. Z3 od 3.
  299. Since we can join a texture and an attribute to the Poly3, for that we use
  300. second cycle gadget. By choosing a Texture or Attribte on it and by sliding
  301. through the list of available Texture or Attribute members, we choose the
  302. texture or attribute that Poly3 should have.
  303. NOTE: If we want to set Attribute and Texture, we have to Add them first.
  304. Otherwise Poly3 does not point to any Texture or/and Attribute.
  305.  
  306. Poly4:
  307.    ________________
  308.   |     Poly4      |
  309.   |________________|
  310.    _________________
  311. N | Number |  Name  |
  312.   |________|________|________ ________
  313. X |   X1   |   X2   |   X3   |   X4   |
  314.   |________|________|________|________|
  315. Y |   Y1   |   Y2   |   Y3   |   Y4   |
  316.   |________|________|________|________|
  317. Z |   Z1   |   Z2   |   Z3   |   Z4   |
  318.   |________|________|________|________|
  319.  
  320.    ________________   ________________
  321.   |     Texture    | |    Attribute   |
  322.   |________________| |________________|
  323.  
  324. Poly4 is almost identical to Poly3, except it has 4 points in 3D space.
  325.  
  326. Field:
  327.    ________________
  328.   |      Field     |
  329.   |________________|
  330.    _________________
  331. N | Number |  Name  |
  332.   |________|________|
  333. X |        |        |
  334.   |________|________|
  335. Y |        |        |
  336.   |________|________|
  337. Z |        |        |
  338.   |________|________|
  339.  
  340. Number value displays number of active Field.
  341. Name is a name of the active Field.
  342. NOTE: Fields can only be changed in Field Editor.
  343.  
  344. Object:
  345.    ________________
  346.   |      Object    |
  347.   |________________|
  348.    _________________
  349. N | Number |  Name  |
  350.   |________|________|
  351. X |        |        |
  352.   |________|________|
  353. Y |        |        |
  354.   |________|________|
  355. Z |        |        |
  356.   |________|________|
  357.  
  358. Number value displays number of active Object.
  359. Name is a name of the active Object.
  360. NOTE: Fields can only be changed in Object Editor.
  361.  
  362. Monster:
  363.    ________________
  364.   |     Monster    |
  365.   |________________|
  366.    _________________
  367. N | Number |  Name  |
  368.   |________|________|
  369. X |        |        |
  370.   |________|________|
  371. Y |        |        |
  372.   |________|________|
  373. Z |        |        |
  374.   |________|________|
  375.  
  376. Number value displays number of active Monster.
  377. Name is a name of the active Monster.
  378.  
  379. Map Field:
  380.  
  381.    ________________
  382.   |    Map Field   |
  383.   |________________|
  384.    _________________
  385. N | Number |  Name  |
  386.   |________|________|
  387. X |   X    |   X    |
  388.   |________|________|
  389. Y |   Y    |   Y    |
  390.   |________|________|
  391. Z |   Z    |   Z    |
  392.   |________|________|
  393.    ________________
  394.   |   Field List   |
  395.   |________________|
  396.  
  397. Number value displays number of active Map Field.
  398. Name is a name of the active Monster.
  399. Name is not used in case of Poly3.
  400. X, Y and Z are the coordinates of the Map Field in the Map.
  401. Map Field is really a pointer used to connect Fields (explained before) to
  402. Maps. We set the coordinates of a Map Field (but really the coordinates of
  403. a real Field on the Map) using input gadgets and we set to which Field the
  404. Map Field is pointing using second cycle gadget.
  405. NOTE: If we want to set to which Field the Map Field us pointing, we have to
  406. Add at least one Field. Otherwise Map Field does not pointto any Field.
  407. Map Fields can be changed only in Map Editor.
  408.  
  409. Map Object:
  410.    ________________
  411.   |   Map Object   |
  412.   |________________|
  413.    _________________
  414. N | Number |  Name  |
  415.   |________|________|
  416. X |   X    |   X    |
  417.   |________|________|
  418. Y |   Y    |   Y    |
  419.   |________|________|
  420. Z |   Z    |   Z    |
  421.   |________|________|
  422.    ________________
  423.   |   Object List  |
  424.   |________________|
  425.  
  426. Map Object is very similar to Map Field, except it can be used in Map
  427. Editor and in Field Editor.
  428. NOTE: Map Objects in Map Editor and in Field Editor are not the same, those
  429. are two separated groups, used for same purpose.
  430.  
  431. Map Monster:
  432.    ________________
  433.   |   Map Monster  |
  434.   |________________|
  435.    _________________
  436. N | Number |  Name  |
  437.   |________|________|
  438. X |   X    |   X    |
  439.   |________|________|
  440. Y |   Y    |   Y    |
  441.   |________|________|
  442. Z |   Z    |   Z    |
  443.   |________|________|
  444.    ________________
  445.   |  Monster List  |
  446.   |________________|
  447.  
  448. Map Monster is very similar to Map Field and Map Object, except it can be
  449. used in Map Editor only.
  450.  
  451. Text List:
  452.  
  453.    ________________
  454.   |    Text List   |
  455.   |________________|
  456.    _________________
  457. N | Number |  Name  |
  458.   |________|________|
  459. X |        |        |
  460.   |________|________|
  461. Y |        |        |
  462.   |________|________|
  463. Z |        |        |
  464.   |________|________|
  465.  
  466. Number value displays number of active member in Text (texture) List.
  467. Name is a name of the active member in Text List.
  468.  
  469. This gadget is used for adding another membet in Text (texture) List. It is
  470. saved with its name and user has to adapt his program to load the right
  471. texture picture.
  472.  
  473. Attrib List:
  474.  
  475.    ________________
  476.   |  Attrib List   |
  477.   |________________|
  478.    _________________
  479. N | Number |  Name  |
  480.   |________|________|________
  481. X |   A1   |   A4   |   A7   |
  482.   |________|________|________|
  483. Y |   A2   |   A5   |   A8   |
  484.   |________|________|________|
  485. Z |   A3   |   A6   |   A9   |
  486.   |________|________|________|
  487.  
  488. Number value displays number of active member in Attrib (attribute) List.
  489. Name is a name of the active member in Attrib List.
  490. A1 to A9 are are 9 unsigned int values to be entered as attribute values.
  491. The user adapts his program to use these values.
  492.  
  493. Field Descr:
  494.    ________________
  495.   |  Field Descr   |
  496.   |________________|
  497.    _________________
  498. N | Number |  Name  |
  499.   |________|________|________ ________
  500. X |   X    |   A1   |   A4   |   A7   |
  501.   |________|________|________|________|
  502. Y |   Y    |   A2   |   A5   |   A8   |
  503.   |________|________|________|________|
  504. Z |   Z    |   A3   |   A6   |   A9   |
  505.   |________|________|________|________|
  506.  
  507. Number value displays number of active member in Field Descr (description).
  508. Name is a name of the active member in Field Descr list.
  509. X, Y and Z are the coordinates of field the user wants to define (long).
  510. A1 to A9 are 9 unsigned int values.
  511. Example: Just as you can add attributes to polygons, you can add attributes
  512. to chosen point in space with this option.
  513. NOTE: Field Descr can only be used in Map Editor.
  514.  
  515. Set Actions:
  516.    ________________
  517.   |  Set Actions   |
  518.   |________________|
  519.    _________________
  520. N | Number |        |
  521.   |________|________|
  522. X |   X    |   A1   |
  523.   |________|________|
  524. Y |   Y    |   A2   |
  525.   |________|________|
  526. Z |   Z    |        |
  527.   |________|________|
  528.  
  529.    ________________   ________________
  530.   |  Obj Source L  | |  Obj Destin L  |
  531.   |________________| |________________|
  532.  
  533. Number value displays number of active member in Set Actions list.
  534. X, Y and Z are coordinates for action trigger in 3D space.
  535. A1 and A2 are Action Values. (unsigned long)
  536. Obj Source L and Obj Destin L are pointers to Map Objects. Obj Source L
  537. points to trigger Map Object and Obj Source L points to action Map Object,
  538. ie. the Map Object to which something happens. A1 and A2 are values which
  539. the users program interprets and based upon them comes to a decision what
  540. should happen to a action/destination Map Object. If user wants something
  541. to happen if, lets say, player comes to a specified position in 3D space,
  542. X, Y and Z coordinates are used.
  543. For my 3D game engine I needed that kind of setup, but after all user can
  544. use these values any way he wants to and intepret them in his program.
  545. NOTE: Set Actions can be used only in Map Editor.
  546. User can point to an Map Object with as many actions as he wants.
  547.  
  548. That just about covers all current gadgets.
  549. If something is not clear to you, contact me via e-mail and I'll try to
  550. answer your question and correct the doc so it explains the subject better.
  551. If you think something is missing in the tool, or is not expanded enough,
  552. contact me via e-mail and I'll think about adding/correcting when I find
  553. the time to do it.
  554.  
  555. --
  556.  
  557. Save and Load:
  558.  
  559. This part is for you programmers who want to use this tool and are
  560. interested how it saves and loads the data. To make it easyer for you and
  561. me to get past this part I'll assume you have the knowlege of C and I'll
  562. insert C source for saving and loading here and explain it. Although I'll
  563. give some explanations, I hope you can read C and out of it get the idea
  564. how the save file looks. If there will be anything uncelar to you, please
  565. e-mail me and I'll try to explain it.
  566.  
  567. Protos and structures:
  568.  
  569. struct Poly3 {    long int x1,y1,z1;
  570.         long int x2,y2,z2;
  571.         long int x3,y3,z3;
  572.         struct Text *Texture;
  573.         struct Attrib *Attribute;
  574.         struct Poly3 *PolyPrevious3;
  575.         struct Poly3 *PolyNext3;
  576. };
  577.  
  578. struct Poly4 {    long int x1,y1,z1;
  579.         long int x2,y2,z2;
  580.         long int x3,y3,z3;
  581.         long int x4,y4,z4;
  582.         struct Text *Texture;
  583.         struct Attrib *Attribute;
  584.         struct Poly4 *PolyPrevious4;
  585.         struct Poly4 *PolyNext4;
  586. };
  587.  
  588. struct Action {    long int x,y,z;
  589.         struct MapObject *SourceObject;
  590.         struct MapObject *DestObject;
  591.         unsigned long int ActionValue;
  592.         unsigned long int ActionValue1;
  593.         struct Action *ActionPrevious;
  594.         struct Action *ActionNext;
  595. };
  596.  
  597. struct Object {    unsigned long int Object;
  598.         unsigned long int Used;
  599.         struct Poly3 *Poly3;
  600.         struct Poly3 *PolyActive3;
  601.         struct Poly3 *PolyLast3;
  602.         unsigned long int ActivePoly3Nr;
  603.         struct Poly4 *Poly4;
  604.         struct Poly4 *PolyActive4;
  605.         struct Poly4 *PolyLast4;
  606.         unsigned long int ActivePoly4Nr;
  607.         char name[25];
  608.         struct Object *NObject;
  609.         struct Object *PObject;
  610. };
  611.  
  612. struct MapObject { unsigned long int Used;
  613.             unsigned long int MapObject;
  614.             long int x,y,z;
  615.             struct Object *Object;
  616.             struct MapObject *PMapObject;
  617.             struct MapObject *NMapObject;
  618. };
  619.  
  620. struct MapField {    long int x,y,z;
  621.             struct Field *Field;
  622.             struct MapField *PMapField;
  623.             struct MapField *NMapField;
  624. };
  625.  
  626. struct Field { unsigned long int Field;
  627.         unsigned long int Used;
  628.         struct Poly3 *Poly3;
  629.         struct Poly3 *PolyActive3;
  630.         struct Poly3 *PolyLast3;
  631.         unsigned long int ActivePoly3Nr;
  632.         struct Poly4 *Poly4;
  633.         struct Poly4 *PolyActive4;
  634.         struct Poly4 *PolyLast4;
  635.         unsigned long int ActivePoly4Nr;
  636.         struct MapObject *MapObject;
  637.         struct MapObject *MapObjectActive;
  638.         struct MapObject *MapObjectLast;
  639.         unsigned long int ActiveMapObjectNr;
  640.         char name[25];
  641.         struct Field *NField;
  642.         struct Field *PField;
  643. };
  644.  
  645. struct Monster { unsigned long int Monster;
  646.             unsigned long int Used;
  647.             char name[25];
  648.             struct Monster *NMonster;
  649.             struct Monster *PMonster;
  650. };
  651.  
  652. struct MapMonster {    long int x,y,z;
  653.             struct Monster *Monster;
  654.             struct MapMonster *PMapMonster;
  655.             struct MapMonster *NMapMonster;
  656. };
  657.  
  658. struct Map {    long int x,y,z;
  659.         struct Poly3 *Poly3;
  660.         struct Poly3 *PolyActive3;
  661.         struct Poly3 *PolyLast3;
  662.         unsigned long int ActivePoly3Nr;
  663.         struct Poly4 *Poly4;
  664.         struct Poly4 *PolyActive4;
  665.         struct Poly4 *PolyLast4;
  666.         unsigned long int ActivePoly4Nr;
  667.         struct Action *Action;
  668.         struct Action *ActionActive;
  669.         struct Action *ActionLast;
  670.         unsigned long int ActiveActionNr;
  671.         struct MapField *MapField;
  672.         struct MapField *MapFieldActive;
  673.         struct MapField *MapFieldLast;
  674.         unsigned long int ActiveMapFieldNr;
  675.         struct MapObject *MapObject;
  676.         struct MapObject *MapObjectActive;
  677.         struct MapObject *MapObjectLast;
  678.         unsigned long int ActiveMapObjectNr;
  679.         struct MapMonster *MapMonster;
  680.         struct MapMonster *MapMonsterActive;
  681.         struct MapMonster *MapMonsterLast;
  682.         unsigned long int ActiveMapMonsterNr;
  683.         struct FieldDes *FieldDes;
  684.         struct FieldDes *FieldDesActive;
  685.         struct FieldDes *FieldDesLast;
  686.         unsigned long int ActiveFieldDesNr;
  687.         char name[25];
  688.         struct Map *NMap;
  689.         struct Map *PMap;
  690. };
  691.  
  692. struct Text {    unsigned long int Texture;
  693.         unsigned long int Used;
  694.         char name[25];
  695.         struct Text *NText;
  696.         struct Text *PText;
  697. };
  698.  
  699. struct Attrib {    unsigned long int Attribute;
  700.         unsigned long int Used;
  701.         unsigned int r, g, b;
  702.         unsigned int Illumination;
  703.         unsigned int Transparency;
  704.         unsigned int Reflectivity;
  705.         unsigned int Smoothyness;
  706.         unsigned int Bumpyness;
  707.         unsigned int Effect;
  708.         char name[25];
  709.         struct Attrib *NAttrib;
  710.         struct Attrib *PAttrib;
  711. };
  712.  
  713. struct FieldDes    {    unsigned long int Field;
  714.             long int x,y,z;
  715.             unsigned int A,B,C;
  716.             unsigned int D,E,F;
  717.             unsigned int G,H,I;
  718.             char name[25];
  719.             struct FieldDes *NFD;
  720.             struct FieldDes *PFD;
  721. };
  722.  
  723. struct Map Scene = { 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0,
  724.                     NULL, NULL, NULL, 0, NULL, NULL, NULL, 0,
  725.                     NULL, NULL, NULL, 0, NULL, NULL, NULL, 0,
  726.                     NULL, NULL, NULL, 0,
  727.                     "", NULL, NULL };
  728.  
  729. struct Field Field = { 0, 0, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, NULL,
  730.             NULL, NULL, 0, "",NULL, NULL };
  731.  
  732. struct Object Object_ = { 0, 0, NULL, NULL, NULL, 0, NULL, NULL, NULL, 0, "",
  733.                         NULL, NULL };
  734.  
  735. struct Monster Monster = { 0, 0, "", NULL, NULL };
  736.  
  737. struct Text Texture = { 0, 0, "", NULL, NULL };
  738.  
  739. struct Attrib Attribute = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", NULL, NULL};
  740.  
  741. struct Map *ActiveMap;
  742. struct Map *LastMap;
  743. struct Field *ActiveField;
  744. struct Field *LastField;
  745. struct Object *ActiveObject;
  746. struct Object *LastObject;
  747. struct Monster *ActiveMonster;
  748. struct Monster *LastMonster;
  749. struct Text *ActiveText;
  750. struct Text *LastText;
  751. struct Attrib *ActiveAttrib;
  752. struct Attrib *LastAttrib;
  753.  
  754. UWORD LastMapNr;
  755. UWORD ActiveMapNr;
  756. UWORD LastFieldNr;
  757. UWORD ActiveFieldNr;
  758. UWORD LastObjectNr;
  759. UWORD ActiveObjectNr;
  760. UWORD LastMonsterNr;
  761. UWORD ActiveMonsterNr;
  762. UWORD LastTextNr;
  763. UWORD ActiveTextNr;
  764. UWORD LastAttribNr;
  765. UWORD ActiveAttribNr;
  766.  
  767. void SavePoly3(struct Poly3 *Poly3First, struct Poly3 *Poly3Last, FILE *fp);
  768. void SavePoly4(struct Poly4 *Poly4First, struct Poly4 *Poly4Last, FILE *fp);
  769. void SaveAction(struct Action *ActionFirst,struct Action *ActionLast,FILE *fp);
  770. void SaveObject(struct Object *ObjectFirst,struct Object *ObjectLast,FILE *fp);
  771. void SaveMapObject( struct MapObject *MOF, struct MapObject *MOL, FILE *fp);
  772. void SaveMapField( struct MapField *MFF, struct MapField *MFL, FILE *fp);
  773. void SaveField(struct Field *FieldFirst,struct Field *FieldLast,FILE *fp);
  774. void SaveMonster(struct Monster *MonsterFirst,struct Monster *MonsterLast,FILE *fp);
  775. void SaveMapMonster(struct MapMonster *MMF,struct MapMonster *MML,FILE *fp);
  776. void SaveMap(struct Map *MapFirst,struct Map *MapLast,FILE *fp);
  777. void SaveText(struct Text *TextFirst,struct Text *TextLast,FILE *fp);
  778. void SaveAttrib(struct Attrib *AttribFirst,struct Attrib *AttribLast,FILE *fp);
  779. void SaveFieldDes( struct FieldDes *FDF, struct FieldDes *FDL ,FILE *fp );
  780.  
  781. struct Map * LoadMap(struct Map *, unsigned long int, FILE *);
  782. struct Poly3 *LoadPoly3(struct Poly3 *, unsigned long, FILE *);
  783. struct Poly4 *LoadPoly4(struct Poly4 *, unsigned long, FILE *);
  784. struct Action *LoadAction(struct Action *, unsigned long, struct MapObject *, FILE *);
  785. struct Object *LoadObject(struct Object *, unsigned long, FILE *);
  786. struct MapObject *LoadMapObject(struct MapObject *, unsigned long, FILE *);
  787. struct MapField *LoadMapField(struct MapField *, unsigned long, FILE *);
  788. struct Field *LoadField(struct Field *, unsigned long, FILE *);
  789. struct Monster *LoadMonster(struct Monster *, unsigned long, FILE *);
  790. struct MapMonster *LoadMapMonster(struct MapMonster *, unsigned long, FILE *);
  791. struct Text *LoadText(struct Text *, unsigned long, FILE *);
  792. struct Attrib *LoadAttrib(struct Attrib *, unsigned long, FILE *);
  793. struct FieldDes *LoadFieldDes(struct FieldDes *, unsigned long, FILE *);
  794.  
  795. Save functions:
  796.  
  797. To understand the save and load functions just follow the functions.
  798. Start with "void Save( void ) {" and "void Load( void ) {". Some parts are
  799. very similar in some functions ( you will recognize 2 main types of
  800. functions, they all work acording to 2 principles, function that represents
  801. group 1 is Save/Load Map function and group 2 is Save/Load Poly3 function )
  802. and that should ease your understanding of those functions. For easyer
  803. understanding try saving the "not touched" Map, totally clear Map, and try
  804. to connect it to the functions.
  805. Soon will write a save function for making much less complex save files,
  806. ready to easy load into 3D engines.
  807.  
  808. NOTE: For now you can save only all of the data and load it the same way.
  809.       I will extend that very soon, so you will be able to save and load
  810.       what you need.
  811.  
  812.  
  813.  
  814. void Save( void ) {
  815.  
  816. struct Library *AslBase;
  817.  
  818. struct FileRequester *fr;
  819.  
  820. FILE *fp;
  821.  
  822. char Smece[] = "Slash^FVR FVMap";
  823. char File[400];
  824. char Dir[400];
  825. char DirFile[400];
  826.  
  827.     if (AslBase = OpenLibrary("asl.library", 36L))
  828.     {
  829.         if (fr = (struct FileRequester *)
  830.             AllocAslRequest(ASL_FileRequest, frtags ))
  831.         {
  832.             if (AslRequest(fr, 0L)) {
  833.                 sprintf( Dir, "%s%s", fr->rf_Dir );
  834.                 sprintf( File, "%s%s", fr->rf_File );
  835.                 sprintf( DirFile, "%s%s", fr->rf_Dir, fr->rf_File);
  836.             }
  837.             else {
  838.                 return;
  839.             }
  840.         }
  841.         FreeAslRequest(fr);
  842.     }
  843.     CloseLibrary(AslBase);
  844.  
  845. if( strlen( File ) == 0 )
  846.     return;
  847.  
  848. fp = fopen( DirFile, "wb" );
  849. if( fp == NULL )
  850.     return;
  851.  
  852. fwrite( Smece, 16, 1, fp );
  853.  
  854. SaveMap( &Scene, LastMap, fp );
  855.  
  856. fclose(fp);
  857.  
  858. }
  859.  
  860. /* START OF SAVE FUNCTIONS */
  861.  
  862. void SavePoly3(struct Poly3 *Poly3First, struct Poly3 *Poly3Last, FILE *fp) {
  863.  
  864. long int la[11];
  865. unsigned long int Poly3C = 0;
  866. struct Poly3 *Poly3P = Poly3First;
  867.  
  868. if( Poly3Last != NULL ) {
  869.  
  870.     while( Poly3P != Poly3Last->PolyNext3 ) {
  871.         Poly3C++;
  872.         Poly3P = Poly3P->PolyNext3;
  873.     }
  874.     la[0] = 1; /* A description number 0 Map, 1 Poly3, .... */
  875.     la[1] = Poly3C; /* Number of members to save/load. */
  876.     fwrite(la, 2, 4, fp);
  877. }
  878.  
  879. while( Poly3First != Poly3Last->PolyNext3 && Poly3First != NULL ) {
  880.  
  881.     la[0] = Poly3First->x1; /* Data, who'd guess :) */
  882.     la[1] = Poly3First->y1;
  883.     la[2] = Poly3First->z1;
  884.     la[3] = Poly3First->x2;
  885.     la[4] = Poly3First->y2;
  886.     la[5] = Poly3First->z2;
  887.     la[6] = Poly3First->x3;
  888.     la[7] = Poly3First->y3;
  889.     la[8] = Poly3First->z3;
  890.     la[9] = Poly3First->Texture->Texture;
  891.     la[10] = Poly3First->Attribute->Attribute;
  892.     fwrite(la, 11, 4, fp);
  893.  
  894.     Poly3First = Poly3First->PolyNext3;
  895. }
  896.  
  897. }
  898.  
  899. void SavePoly4(struct Poly4 *Poly4First, struct Poly4 *Poly4Last, FILE *fp) {
  900.  
  901. long int la[14];
  902. unsigned long int Poly4C = 0;
  903. struct Poly4 *Poly4P = Poly4First;
  904.  
  905. if( Poly4Last != NULL ) {
  906.  
  907.     while( Poly4P != Poly4Last->PolyNext4 ) {
  908.         Poly4C++;
  909.         Poly4P = Poly4P->PolyNext4;
  910.     }
  911.     la[0] = 2;
  912.     la[1] = Poly4C;
  913.     fwrite(la, 2, 4, fp);
  914. }
  915.  
  916. while( Poly4First != Poly4Last->PolyNext4 && Poly4First != NULL ) {
  917.  
  918.     la[0] = Poly4First->x1;
  919.     la[1] = Poly4First->y1;
  920.     la[2] = Poly4First->z1;
  921.     la[3] = Poly4First->x2;
  922.     la[4] = Poly4First->y2;
  923.     la[5] = Poly4First->z2;
  924.     la[6] = Poly4First->x3;
  925.     la[7] = Poly4First->y3;
  926.     la[8] = Poly4First->z3;
  927.     la[9] = Poly4First->x4;
  928.     la[10] = Poly4First->y4;
  929.     la[11] = Poly4First->z4;
  930.     la[12] = Poly4First->Texture->Texture;
  931.     la[13] = Poly4First->Attribute->Attribute;
  932.     fwrite(la, 14, 4, fp);
  933.  
  934.     Poly4First = Poly4First->PolyNext4;
  935. }
  936.  
  937. }
  938.  
  939. void SaveAction(struct Action *ActionFirst,struct Action *ActionLast,FILE *fp) {
  940.  
  941. long la[7];
  942. unsigned long int ActionC = 0;
  943. struct Action *ActionP = ActionFirst;
  944.  
  945. if( ActionLast != NULL ) {
  946.  
  947.     while( ActionP != ActionLast->ActionNext ) {
  948.         ActionC++;
  949.         ActionP = ActionP->ActionNext;
  950.     }
  951.     la[0] = 12;
  952.     la[1] = ActionC;
  953.     fwrite(la, 2, 4, fp);
  954. }
  955.  
  956. while( ActionFirst != ActionLast->ActionNext && ActionFirst != NULL ) {
  957.  
  958.     la[0] = ActionFirst->x;
  959.     la[1] = ActionFirst->y;
  960.     la[2] = ActionFirst->z;
  961.     if( ActionFirst->SourceObject != NULL )
  962.         la[3] = ActionFirst->SourceObject->MapObject;
  963.     else
  964.         la[3] = 0;
  965.     la[4] = ActionFirst->DestObject->MapObject;
  966.     if( ActionFirst->DestObject != NULL )
  967.         la[4] = ActionFirst->DestObject->MapObject;
  968.     else
  969.         la[4] = 0;
  970.     la[5] = ActionFirst->ActionValue;
  971.     la[6] = ActionFirst->ActionValue1;
  972.     fwrite(la, 7, 4, fp);
  973.  
  974.     ActionFirst = ActionFirst->ActionNext;
  975. }
  976.  
  977. }
  978.  
  979. void SaveObject(struct Object *ObjectFirst,struct Object *ObjectLast,FILE *fp) {
  980.  
  981. long la[3];
  982.  
  983. unsigned long int ObjectC = 0;
  984. struct Object *ObjectP = ObjectFirst;
  985.  
  986. if( ObjectLast != NULL ) {
  987.  
  988.     while( ObjectP != ObjectLast->NObject ) {
  989.         ObjectC++;
  990.         ObjectP = ObjectP->NObject;
  991.     }
  992.     la[0] = 4;
  993.     la[1] = ObjectC;
  994.     fwrite(la, 2, 4, fp);
  995. }
  996.  
  997. while( ObjectFirst != ObjectLast->NObject && ObjectFirst != NULL ) {
  998.  
  999.     fwrite(ObjectFirst->name, 26, 1, fp);
  1000.  
  1001.     if( ObjectFirst->Poly3 != NULL )
  1002.     SavePoly3( ObjectFirst->Poly3, ObjectFirst->PolyLast3, fp);
  1003.     else {
  1004.     la[0] = 1;
  1005.     la[1] = 0;
  1006.     fwrite(la, 2, 4, fp);
  1007.     }
  1008.     if( ObjectFirst->Poly4 != NULL )
  1009.     SavePoly4( ObjectFirst->Poly4, ObjectFirst->PolyLast4, fp);
  1010.     else {
  1011.     la[0] = 2;
  1012.     la[1] = 0;
  1013.     fwrite(la, 2, 4, fp);
  1014.     }
  1015.  
  1016.     ObjectFirst = ObjectFirst->NObject;
  1017. }
  1018.  
  1019. }
  1020.  
  1021. void SaveMapObject( struct MapObject *MOF, struct MapObject *MOL, FILE *fp) {
  1022.  
  1023. unsigned long int la[4];
  1024.  
  1025. unsigned long int MapObjectC = 0;
  1026. struct MapObject *MapObjectP = MOF;
  1027.  
  1028. if( MOL != NULL ) {
  1029.  
  1030.     while( MapObjectP != MOL->NMapObject ) {
  1031.         MapObjectC++;
  1032.         MapObjectP = MapObjectP->NMapObject;
  1033.     }
  1034.     la[0] = 7;
  1035.     la[1] = MapObjectC;
  1036.     fwrite(la, 2, 4, fp);
  1037. }
  1038.  
  1039. while( MOF != MOL->NMapObject && MOF != NULL ) {
  1040.  
  1041.     la[0] = MOF->x;
  1042.     la[1] = MOF->y;
  1043.     la[2] = MOF->z;
  1044.     la[3] = MOF->Object->Object;
  1045.     fwrite(la, 4, 4, fp);
  1046.  
  1047.     MOF = MOF->NMapObject;
  1048. }
  1049.  
  1050. }
  1051.  
  1052. void SaveMapField( struct MapField *MFF, struct MapField *MFL, FILE *fp) {
  1053.  
  1054. unsigned long int la[4];
  1055.  
  1056. unsigned long int MapFieldC = 0;
  1057. struct MapField *MapFieldP = MFF;
  1058.  
  1059. if( MFL != NULL ) {
  1060.  
  1061.     while( MapFieldP != MFL->NMapField ) {
  1062.         MapFieldC++;
  1063.         MapFieldP = MapFieldP->NMapField;
  1064.     }
  1065.     la[0] = 6;
  1066.     la[1] = MapFieldC;
  1067.     fwrite(la, 2, 4, fp);
  1068. }
  1069.  
  1070. while( MFF != MFL->NMapField && MFF != NULL ) {
  1071.  
  1072.     la[0] = MFF->x;
  1073.     la[1] = MFF->y;
  1074.     la[2] = MFF->z;
  1075.     la[3] = MFF->Field->Field;
  1076.     fwrite(la, 4, 4, fp);
  1077.  
  1078.     MFF = MFF->NMapField;
  1079. }
  1080.  
  1081. }
  1082.  
  1083. void SaveField(struct Field *FieldFirst,struct Field *FieldLast,FILE *fp) {
  1084.  
  1085. long la[3];
  1086.  
  1087. unsigned long int FieldC = 0;
  1088. struct Field *FieldP = FieldFirst;
  1089.  
  1090. if( FieldLast != NULL ) {
  1091.  
  1092.     while( FieldP != FieldLast->NField ) {
  1093.         FieldC++;
  1094.         FieldP = FieldP->NField;
  1095.     }
  1096.     la[0] = 3;
  1097.     la[1] = FieldC;
  1098.     fwrite(la, 2, 4, fp);
  1099. }
  1100.  
  1101. while( FieldFirst != FieldLast->NField && FieldFirst != NULL ) {
  1102.  
  1103.     fwrite(FieldFirst->name, 26, 1, fp);
  1104.  
  1105.     if( FieldFirst->Poly3 != NULL )
  1106.     SavePoly3( FieldFirst->Poly3, FieldFirst->PolyLast3, fp);
  1107.     else {
  1108.     la[0] = 1;
  1109.     la[1] = 0;
  1110.     fwrite(la, 2, 4, fp);
  1111.     }
  1112.     if( FieldFirst->Poly4 != NULL )
  1113.     SavePoly4( FieldFirst->Poly4, FieldFirst->PolyLast4, fp);
  1114.     else {
  1115.     la[0] = 2;
  1116.     la[1] = 0;
  1117.     fwrite(la, 2, 4, fp);
  1118.     }
  1119.     if( FieldFirst->MapObject != NULL )
  1120.     SaveMapObject( FieldFirst->MapObject, FieldFirst->MapObjectLast, fp);
  1121.     else {
  1122.     la[0] = 7;
  1123.     la[1] = 0;
  1124.     fwrite(la, 2, 4, fp);
  1125.     }
  1126.  
  1127.     FieldFirst = FieldFirst->NField;
  1128. }
  1129.  
  1130. }
  1131.  
  1132. void SaveMonster(struct Monster *MonsterFirst,struct Monster *MonsterLast,FILE *fp) {
  1133.  
  1134. long la[3];
  1135.  
  1136. unsigned long int MonsterC = 0;
  1137. struct Monster *MonsterP = MonsterFirst;
  1138.  
  1139. if( MonsterLast != NULL ) {
  1140.  
  1141.     while( MonsterP != MonsterLast->NMonster ) {
  1142.         MonsterC++;
  1143.         MonsterP = MonsterP->NMonster;
  1144.     }
  1145.     la[0] = 5;
  1146.     la[1] = MonsterC;
  1147.     fwrite(la, 2, 4, fp);
  1148. }
  1149.  
  1150. while( MonsterFirst != MonsterLast->NMonster && MonsterFirst != NULL ) {
  1151.  
  1152.     fwrite(MonsterFirst->name, 26, 1, fp);
  1153.  
  1154.     MonsterFirst = MonsterFirst->NMonster;
  1155. }
  1156.  
  1157. }
  1158.  
  1159. void SaveMapMonster(struct MapMonster *MMF,struct MapMonster *MML,FILE *fp) {
  1160.  
  1161. unsigned long int la[4];
  1162.  
  1163. unsigned long int MapMonsterC = 0;
  1164. struct MapMonster *MapMonsterP = MMF;
  1165.  
  1166. if( MML != NULL ) {
  1167.  
  1168.     while( MapMonsterP != MML->NMapMonster ) {
  1169.         MapMonsterC++;
  1170.         MapMonsterP = MapMonsterP->NMapMonster;
  1171.     }
  1172.     la[0] = 8;
  1173.     la[1] = MapMonsterC;
  1174.     fwrite(la, 2, 4, fp);
  1175. }
  1176.  
  1177. while( MMF != MML->NMapMonster && MMF != NULL ) {
  1178.  
  1179.     la[0] = MMF->x;
  1180.     la[1] = MMF->y;
  1181.     la[2] = MMF->z;
  1182.     la[3] = MMF->Monster->Monster;
  1183.     fwrite(la, 4, 4, fp);
  1184.  
  1185.     MMF = MMF->NMapMonster;
  1186. }
  1187.  
  1188. }
  1189.  
  1190. void SaveMap(struct Map *MapFirst,struct Map *MapLast,FILE *fp) {
  1191.  
  1192. long la[3];
  1193.  
  1194. unsigned long int MapC = 0;
  1195. struct Map *MapP = MapFirst;
  1196.  
  1197. if( MapLast != NULL ) {
  1198.  
  1199.     while( MapP != MapLast->NMap ) {
  1200.         MapC++;
  1201.         MapP = MapP->NMap;
  1202.     }
  1203.     la[0] = 0;
  1204.     la[1] = MapC;
  1205.     fwrite(la, 2, 4, fp);
  1206. }
  1207.  
  1208.     SaveField( &Field, LastField, fp );
  1209.     SaveObject( &Object_, LastObject, fp );
  1210.     SaveMonster( &Monster, LastMonster, fp );
  1211.     SaveText( &Texture, LastText, fp );
  1212.     SaveAttrib( &Attribute, LastAttrib, fp );
  1213.  
  1214. while( MapFirst != MapLast->NMap && MapFirst != NULL ) {
  1215.  
  1216.     fwrite(MapFirst->name, 26, 1, fp);
  1217.  
  1218.     la[0] = MapFirst->x;
  1219.     la[1] = MapFirst->y;
  1220.     la[2] = MapFirst->z;
  1221.  
  1222.     fwrite(la, 4, 3, fp);
  1223.  
  1224. /* Map save function calls other functions that save data connected under
  1225. the Map. Some other functions do that too. */
  1226.  
  1227.     if( MapFirst->Poly3 != NULL ) {
  1228.     SavePoly3( MapFirst->Poly3, MapFirst->PolyLast3, fp); }
  1229.     else {
  1230.     la[0] = 1;
  1231.     la[1] = 0;
  1232.     fwrite(la, 2, 4, fp);
  1233.     }
  1234.     if( MapFirst->Poly4 != NULL ) {
  1235.     SavePoly4( MapFirst->Poly4, MapFirst->PolyLast4, fp); }
  1236.     else {
  1237.     la[0] = 2;
  1238.     la[1] = 0;
  1239.     fwrite(la, 2, 4, fp);
  1240.     }
  1241.     if( MapFirst->MapField != NULL ) {
  1242.     SaveMapField( MapFirst->MapField, MapFirst->MapFieldLast, fp ); }
  1243.     else {
  1244.     la[0] = 6;
  1245.     la[1] = 0;
  1246.     fwrite(la, 2, 4, fp);
  1247.     }
  1248.     if( MapFirst->MapObject != NULL ) {
  1249.     SaveMapObject( MapFirst->MapObject, MapFirst->MapObjectLast, fp ); }
  1250.     else {
  1251.     la[0] = 7;
  1252.     la[1] = 0;
  1253.     fwrite(la, 2, 4, fp);
  1254.     }
  1255.     if( MapFirst->MapMonster != NULL ) {
  1256.     SaveMapMonster( MapFirst->MapMonster, MapFirst->MapMonsterLast, fp ); }
  1257.     else {
  1258.     la[0] = 8;
  1259.     la[1] = 0;
  1260.     fwrite(la, 2, 4, fp);
  1261.     }
  1262.     if( MapFirst->FieldDes != NULL ) {
  1263.     SaveFieldDes( MapFirst->FieldDes, MapFirst->FieldDesLast, fp ); }
  1264.     else {
  1265.     la[0] = 11;
  1266.     la[1] = 0;
  1267.     fwrite(la, 2, 4, fp);
  1268.     }
  1269.  
  1270.     if( MapFirst->Action != NULL ) {
  1271.     SaveAction( MapFirst->Action, MapFirst->ActionLast, fp ); }
  1272.     else {
  1273.     la[0] = 12;
  1274.     la[1] = 0;
  1275.     fwrite(la, 2, 4, fp);
  1276.     }
  1277.  
  1278.     MapFirst = MapFirst->NMap;
  1279. }
  1280.  
  1281. }
  1282.  
  1283. void SaveText(struct Text *TextFirst,struct Text *TextLast,FILE *fp) {
  1284.  
  1285. unsigned long int la[3];
  1286.  
  1287. unsigned long int TextC = 0;
  1288. struct Text *TextP = TextFirst;
  1289.  
  1290. if( TextLast != NULL ) {
  1291.  
  1292.     while( TextP != TextLast->NText ) {
  1293.         TextC++;
  1294.         TextP = TextP->NText;
  1295.     }
  1296.     la[0] = 9;
  1297.     la[1] = TextC;
  1298.     fwrite(la, 2, 4, fp);
  1299. }
  1300.  
  1301. while( TextFirst != TextLast->NText && TextFirst != NULL ) {
  1302.  
  1303.     fwrite(TextFirst->name, 26, 1, fp);
  1304.  
  1305.     TextFirst = TextFirst->NText;
  1306. }
  1307.  
  1308. }
  1309.  
  1310. void SaveAttrib(struct Attrib *AttribFirst,struct Attrib *AttribLast,FILE *fp) {
  1311.  
  1312. unsigned long int la[3];
  1313. unsigned long int ia[9];
  1314.  
  1315. unsigned long int AttribC = 0;
  1316. struct Attrib *AttribP = AttribFirst;
  1317.  
  1318. if( AttribLast != NULL ) {
  1319.  
  1320.     while( AttribP != NULL ) {
  1321.         AttribC++;
  1322.         AttribP = AttribP->NAttrib;
  1323.     }
  1324.     la[0] = 10;
  1325.     la[1] = AttribC;
  1326.     fwrite(la, 2, 4, fp);
  1327. }
  1328.  
  1329. while( AttribFirst != AttribLast->NAttrib && AttribFirst != NULL ) {
  1330.  
  1331.     ia[0] = AttribFirst->r;
  1332.     ia[1] = AttribFirst->g;
  1333.     ia[2] = AttribFirst->b;
  1334.     ia[3] = AttribFirst->Illumination;
  1335.     ia[4] = AttribFirst->Transparency;
  1336.     ia[5] = AttribFirst->Reflectivity;
  1337.     ia[6] = AttribFirst->Smoothyness;
  1338.     ia[7] = AttribFirst->Bumpyness;
  1339.     ia[8] = AttribFirst->Effect;
  1340.     fwrite(ia, 4, 9, fp);
  1341.     fwrite(AttribFirst->name, 26, 1, fp);
  1342.  
  1343.     AttribFirst = AttribFirst->NAttrib;
  1344. }
  1345.  
  1346. }
  1347.  
  1348. void SaveFieldDes( struct FieldDes *FDF, struct FieldDes *FDL ,FILE *fp ) {
  1349.  
  1350. unsigned long int la[3];
  1351. unsigned long int ia[12];
  1352.  
  1353. unsigned long int FieldDesC = 0;
  1354. struct FieldDes *FieldDesP = FDF;
  1355.  
  1356. if( FDL != NULL ) {
  1357.  
  1358.     while( FieldDesP != FDL->NFD ) {
  1359.         FieldDesC++;
  1360.         FieldDesP = FieldDesP->NFD;
  1361.     }
  1362.     la[0] = 11;
  1363.     la[1] = FieldDesC;
  1364.     fwrite(la, 2, 4, fp);
  1365. }
  1366.  
  1367. while( FDF != FDL->NFD && FDF != NULL ) {
  1368.  
  1369.     la[0] = FDF->x;
  1370.     la[1] = FDF->y;
  1371.     la[2] = FDF->z;
  1372.     fwrite(la, 4, 3, fp);
  1373.  
  1374.     ia[0] = FDF->A;
  1375.     ia[1] = FDF->B;
  1376.     ia[2] = FDF->C;
  1377.     ia[3] = FDF->D;
  1378.     ia[4] = FDF->E;
  1379.     ia[5] = FDF->F;
  1380.     ia[6] = FDF->G;
  1381.     ia[7] = FDF->H;
  1382.     ia[8] = FDF->I;
  1383.     fwrite(ia, 4, 9, fp);
  1384.     fwrite(FDF->name, 26, 1, fp);
  1385.  
  1386.     FDF = FDF->NFD;
  1387. }
  1388.  
  1389. }
  1390.  
  1391. /* END OF SAVE FUNCTIONS */
  1392.  
  1393. Load functions:
  1394.  
  1395. void Load( void ) {
  1396.  
  1397. struct Library *AslBase;
  1398.  
  1399. struct FileRequester *fr;
  1400.  
  1401. int cmpres = 0;
  1402.  
  1403. FILE *fp;
  1404.  
  1405. char File[400];
  1406. char Dir[400];
  1407. char DirFile[400];
  1408. char Smece[] = "Slash^FVR FVMap";
  1409. char Slash[16];
  1410.  
  1411. long int la[2];
  1412. struct Map *MapLast;
  1413.  
  1414.     if (AslBase = OpenLibrary("asl.library", 36L))
  1415.     {
  1416.         if (fr = (struct FileRequester *)
  1417.             AllocAslRequest(ASL_FileRequest, frtags))
  1418.         {
  1419.             if (AslRequest(fr, 0L)) {
  1420.                 sprintf( Dir, "%s%s", fr->rf_Dir );
  1421.                 sprintf( File, "%s%s", fr->rf_File );
  1422.                 sprintf( DirFile, "%s%s", fr->rf_Dir, fr->rf_File);
  1423.             }
  1424.             else {
  1425.                 return;
  1426.             }
  1427.         }
  1428.         FreeAslRequest(fr);
  1429.     }
  1430.     CloseLibrary(AslBase);
  1431.  
  1432. if( strlen( File ) == 0 )
  1433.     return;
  1434.  
  1435. fp = fopen( DirFile, "rb" );
  1436.  
  1437. if( fp == NULL )
  1438.     return;
  1439.  
  1440. fread( Slash, 16, 1, fp ); /* Read 16 bytes. */
  1441. Slash[15] = 0;
  1442.  
  1443. cmpres = strcmp(Slash, Smece); /* Check if it is FVMap save file. */
  1444.  
  1445. if( cmpres != 0 ) {
  1446.     fclose(fp);
  1447.     return;
  1448.     }
  1449.  
  1450.     fread(la, 4, 2, fp); /* Read next data, data description and */
  1451.                  /* number of members */
  1452.  
  1453.     MapLast = LoadMap(&Scene, la[1], fp); /* Call function. */
  1454.     if( MapLast != NULL ) /* Test if loading has has been made after */
  1455.         LastMap = MapLast; /* last member, and if it has, set */
  1456.                    /* last member to returned one. */
  1457.  
  1458. fclose(fp);
  1459.  
  1460. ReDrawView(); /* Some internal stuff you don't use :) */
  1461. ReDrawGadgets();
  1462.  
  1463. }
  1464.  
  1465. /* START OF LOAD FUNCTIONS */
  1466.  
  1467. struct Poly3 *LoadPoly3(struct Poly3 *Poly3, unsigned long Poly3C, FILE *fp) {
  1468.  
  1469. struct Poly3 *PolyLast3 = NULL;
  1470. struct Poly3 *LastPoly3;
  1471. long int la[11];
  1472.  
  1473. LastPoly3 = Poly3->PolyNext3;
  1474.  
  1475. for(; Poly3C > 0; Poly3C--) {
  1476.  
  1477.     fread(la, 4, 11, fp);
  1478.     
  1479.     Poly3->x1 = la[0];
  1480.     Poly3->y1 = la[1];
  1481.     Poly3->z1 = la[2];
  1482.     Poly3->x2 = la[3];
  1483.     Poly3->y2 = la[4];
  1484.     Poly3->z2 = la[5];
  1485.     Poly3->x3 = la[6];
  1486.     Poly3->y3 = la[7];
  1487.     Poly3->z3 = la[8];
  1488.         Poly3->Texture = &Texture;
  1489.         for(; la[9] > 0; la[9]--) {
  1490.             if( Poly3->Texture->NText == NULL )
  1491.                 break;
  1492.             Poly3->Texture = Poly3->Texture->NText;
  1493.             }
  1494.         if( la[9] > 0 )
  1495.             Poly3->Texture = &Texture;
  1496.         Poly3->Texture->Used++;
  1497.  
  1498.         Poly3->Attribute = &Attribute;
  1499.         for(; la[10] > 0; la[10]--) {
  1500.             if( Poly3->Attribute->NAttrib == NULL )
  1501.                 break;
  1502.             Poly3->Attribute = Poly3->Attribute->NAttrib;
  1503.             }
  1504.         if( la[10] > 0 )
  1505.             Poly3->Attribute = &Attribute;
  1506.         Poly3->Attribute->Used++;
  1507.  
  1508.     if( Poly3C > 1 ) {
  1509.         Poly3->PolyNext3 = (struct Poly3 *)malloc(sizeof(struct Poly3));
  1510.         if( Poly3->PolyNext3 == NULL ) {
  1511.             if( LastPoly3 != NULL ) {
  1512.                 LastPoly3->PolyPrevious3 = Poly3;
  1513.                 Poly3->PolyNext3 = LastPoly3;
  1514.                 }
  1515.             else {
  1516.                 Poly3->PolyNext3 = NULL;
  1517.                 PolyLast3 = Poly3;
  1518.                 }
  1519.         return PolyLast3;
  1520.         }
  1521.         Poly3->PolyNext3->PolyPrevious3 = Poly3;
  1522.         Poly3 = Poly3->PolyNext3;
  1523.         }
  1524.     else {
  1525.         if( LastPoly3 != NULL ) {
  1526.             LastPoly3->PolyPrevious3 = Poly3;
  1527.             Poly3->PolyNext3 = LastPoly3;
  1528.             }
  1529.         else {
  1530.             Poly3->PolyNext3 = NULL;
  1531.             PolyLast3 = Poly3;
  1532.             }
  1533.         }
  1534. }
  1535.  
  1536. return PolyLast3;
  1537.  
  1538. }
  1539.  
  1540. struct Poly4 *LoadPoly4(struct Poly4 *Poly4, unsigned long Poly4C, FILE *fp) {
  1541.  
  1542. struct Poly4 *PolyLast4 = NULL;
  1543. struct Poly4 *LastPoly4;
  1544. long int la[14];
  1545.  
  1546. LastPoly4 = Poly4->PolyNext4;
  1547.  
  1548. for(; Poly4C > 0; Poly4C--) {
  1549.  
  1550.     fread(la, 4, 14, fp);
  1551.     
  1552.     Poly4->x1 = la[0];
  1553.     Poly4->y1 = la[1];
  1554.     Poly4->z1 = la[2];
  1555.     Poly4->x2 = la[3];
  1556.     Poly4->y2 = la[4];
  1557.     Poly4->z2 = la[5];
  1558.     Poly4->x3 = la[6];
  1559.     Poly4->y3 = la[7];
  1560.     Poly4->z3 = la[8];
  1561.     Poly4->x4 = la[9];
  1562.     Poly4->y4 = la[10];
  1563.     Poly4->z4 = la[11];
  1564.         Poly4->Texture = &Texture;
  1565.         for(; la[12] > 0; la[12]--) {
  1566.             if( Poly4->Texture->NText == NULL )
  1567.                 break;
  1568.             Poly4->Texture = Poly4->Texture->NText;
  1569.             }
  1570.         if( la[12] > 0 )
  1571.             Poly4->Texture = &Texture;
  1572.         Poly4->Texture->Used++;
  1573.  
  1574.         Poly4->Attribute = &Attribute;
  1575.         for(; la[13] > 0; la[13]--) {
  1576.             if( Poly4->Attribute->NAttrib == NULL )
  1577.                 break;
  1578.             Poly4->Attribute = Poly4->Attribute->NAttrib;
  1579.             }
  1580.         if( la[13] > 0 )
  1581.             Poly4->Attribute = &Attribute;
  1582.         Poly4->Attribute->Used++;
  1583.  
  1584.     if( Poly4C > 1 ) {
  1585.         Poly4->PolyNext4 = (struct Poly4 *)malloc(sizeof(struct Poly4));
  1586.         if( Poly4->PolyNext4 == NULL ) {
  1587.             if( LastPoly4 != NULL ) {
  1588.                 LastPoly4->PolyPrevious4 = Poly4;
  1589.                 Poly4->PolyNext4 = LastPoly4;
  1590.                 }
  1591.             else {
  1592.                 Poly4->PolyNext4 = NULL;
  1593.                 PolyLast4 = Poly4;
  1594.                 }
  1595.         return PolyLast4;
  1596.         }
  1597.         Poly4->PolyNext4->PolyPrevious4 = Poly4;
  1598.         Poly4 = Poly4->PolyNext4;
  1599.         }
  1600.     else {
  1601.         if( LastPoly4 != NULL ) {
  1602.             LastPoly4->PolyPrevious4 = Poly4;
  1603.             Poly4->PolyNext4 = LastPoly4;
  1604.             }
  1605.         else {
  1606.             Poly4->PolyNext4 = NULL;
  1607.             PolyLast4 = Poly4;
  1608.             }
  1609.         }
  1610. }
  1611.  
  1612. return PolyLast4;
  1613.  
  1614. }
  1615.  
  1616. struct Action *LoadAction(struct Action *Action, unsigned long ActionC, struct MapObject *MapObject, FILE *fp) {
  1617.  
  1618. struct Action *ActionLast = NULL;
  1619. struct Action *LastAction;
  1620. long int la[17];
  1621.  
  1622. LastAction = Action->ActionNext;
  1623.  
  1624. for(; ActionC > 0; ActionC--) {
  1625.  
  1626.     fread(la, 4, 7, fp);
  1627.  
  1628.     Action->x = la[0];
  1629.     Action->y = la[1];
  1630.     Action->z = la[2];
  1631.     if( Action != NULL ) {
  1632.         Action->SourceObject = MapObject;
  1633.         for(; la[3] > 0; la[3]--) {
  1634.             if( Action->SourceObject == NULL )
  1635.                 break;
  1636.             if( Action->SourceObject->NMapObject != NULL )
  1637.             Action->SourceObject = Action->SourceObject->NMapObject;
  1638.             }
  1639.         }
  1640.     else
  1641.         Action->SourceObject = NULL;
  1642.     if( Action->SourceObject != NULL )
  1643.         Action->SourceObject->Used++;
  1644.  
  1645.     if( MapObject != NULL ) {
  1646.         Action->DestObject = MapObject;
  1647.         for(; la[4] > 0; la[4]--) {
  1648.             if( Action->DestObject == NULL )
  1649.                 break;
  1650.             if( Action->DestObject->NMapObject != NULL )
  1651.             Action->DestObject = Action->DestObject->NMapObject;
  1652.             }
  1653.         }
  1654.     else
  1655.         Action->DestObject = NULL;
  1656.     if( Action->DestObject != NULL )
  1657.         Action->DestObject->Used++;
  1658.  
  1659.     Action->ActionValue = la[5];
  1660.     Action->ActionValue1 = la[6];
  1661.  
  1662.     if( ActionC > 1 ) {
  1663.         Action->ActionNext = (struct Action *)malloc(sizeof(struct Action));
  1664.         if( Action->ActionNext == NULL ) {
  1665.             if( LastAction != NULL ) {
  1666.                 LastAction->ActionPrevious = Action;
  1667.                 Action->ActionNext = LastAction;
  1668.                 }
  1669.             else {
  1670.                 Action->ActionNext = NULL;
  1671.                 ActionLast = Action;
  1672.                 }
  1673.         return ActionLast;
  1674.         }
  1675.         Action->ActionNext->ActionPrevious = Action;
  1676.         Action = Action->ActionNext;
  1677.         }
  1678.     else {
  1679.         if( LastAction != NULL ) {
  1680.             LastAction->ActionPrevious = Action;
  1681.             Action->ActionNext = LastAction;
  1682.             }
  1683.         else {
  1684.             Action->ActionNext = NULL;
  1685.             ActionLast = Action;
  1686.             }
  1687.         }
  1688. }
  1689.  
  1690. return ActionLast;
  1691.  
  1692. }
  1693.  
  1694. struct Object *LoadObject(struct Object *ObjectI, unsigned long ObjectC, FILE *fp) {
  1695.  
  1696. size_t w;
  1697.  
  1698. struct Object *ObjectLast = NULL;
  1699. struct Object *LastObject;
  1700. struct Poly3 *PolyLast3;
  1701. struct Poly4 *PolyLast4;
  1702. long int la[3];
  1703.  
  1704. LastObject = ObjectI->NObject;
  1705.  
  1706. LastObjectNr--;
  1707.  
  1708. for(; ObjectC > 0; ObjectC--) {
  1709.  
  1710.     fread(ObjectI->name, 26, 1, fp);
  1711.  
  1712.     w = fread(la, 4, 2, fp);
  1713.     if( w != 2 )
  1714.         break;
  1715.     if( la[1] != 0 ) {
  1716.         if( ObjectI->Poly3 == NULL ) {
  1717.             ObjectI->Poly3 = ObjectI->PolyActive3 = ObjectI->PolyLast3 =
  1718.             ( struct Poly3 * )malloc( sizeof( struct Poly3 ) );
  1719.             if( ObjectI->Poly3 == NULL ) {
  1720.                 ObjectI->ActivePoly3Nr = 0;
  1721.                 goto O1;
  1722.             }
  1723.             ObjectI->Poly3->PolyNext3 = NULL;
  1724.             ObjectI->Poly3->PolyPrevious3 = NULL;
  1725.             }
  1726.         PolyLast3 = LoadPoly3(ObjectI->PolyActive3, la[1], fp);
  1727.         if( PolyLast3 != NULL )
  1728.             ObjectI->PolyLast3 = PolyLast3;
  1729.         if( ObjectI->ActivePoly3Nr == 0 ) {
  1730.             ObjectI->PolyActive3 = ObjectI->Poly3;
  1731.             ObjectI->ActivePoly3Nr = 1;
  1732.             }
  1733.         }
  1734.  
  1735. O1:    w = fread(la, 4, 2, fp);
  1736.     if( w != 2 )
  1737.         break;
  1738.     if( la[1] != 0 ) {
  1739.         if( ObjectI->Poly4 == NULL ) {
  1740.             ObjectI->Poly4 = ObjectI->PolyActive4 = ObjectI->PolyLast4 =
  1741.             ( struct Poly4 * )malloc( sizeof( struct Poly4 ) );
  1742.             if( ObjectI->Poly4 == NULL ) {
  1743.                 ObjectI->ActivePoly4Nr = 0;
  1744.                 goto O2;
  1745.             }
  1746.             ObjectI->Poly4->PolyNext4 = NULL;
  1747.             ObjectI->Poly4->PolyPrevious4 = NULL;
  1748.             }
  1749.         PolyLast4 = LoadPoly4(ObjectI->PolyActive4, la[1], fp);
  1750.         if( PolyLast4 != NULL )
  1751.             ObjectI->PolyLast4 = PolyLast4;
  1752.         if( ObjectI->ActivePoly4Nr == 0 ) {
  1753.             ObjectI->PolyActive4 = ObjectI->Poly4;
  1754.             ObjectI->ActivePoly4Nr = 1;
  1755.             }
  1756.         }
  1757.  
  1758. O2:    if( ObjectC > 1 ) {
  1759.         ObjectI->NObject = (struct Object *)malloc(sizeof(struct Object));
  1760.         if( ObjectI->NObject == NULL ) {
  1761.             if( LastObject != NULL ) {
  1762.                 LastObject->PObject = ObjectI;
  1763.                 ObjectI->NObject = LastObject;
  1764.                 }
  1765.             else {
  1766.                 ObjectI->NObject = NULL;
  1767.                 ObjectLast = ObjectI;
  1768.                 }
  1769.         return ObjectLast;
  1770.         }
  1771.         ObjectI->NObject->PObject = ObjectI;
  1772.         ObjectI = ObjectI->NObject;
  1773.         ObjectI->Object = ObjectC - 1;
  1774.         ObjectI->Used = 0;
  1775.         ObjectI->Poly3 = NULL;
  1776.         ObjectI->Poly4 = NULL;
  1777.         ObjectI->PolyActive3 = NULL;
  1778.         ObjectI->PolyActive4 = NULL;
  1779.         ObjectI->ActivePoly3Nr = 0;
  1780.         ObjectI->PolyLast3 = NULL;
  1781.         ObjectI->PolyLast4 = NULL;
  1782.         ObjectI->ActivePoly4Nr = 0;
  1783.         strcpy( ObjectI->name, "" );
  1784.         }
  1785.     else {
  1786.         if( LastObject != NULL ) {
  1787.             LastObject->PObject = ObjectI;
  1788.             ObjectI->NObject = LastObject;
  1789.             }
  1790.         else {
  1791.             ObjectI->NObject = NULL;
  1792.             ObjectLast = ObjectI;
  1793.             }
  1794.         }
  1795.  
  1796. LastObjectNr++;
  1797.  
  1798. }
  1799.  
  1800. return ObjectLast;
  1801.  
  1802. }
  1803.  
  1804. struct MapObject *LoadMapObject( struct MapObject *MapObject, unsigned long MapObjectC, FILE *fp) {
  1805.  
  1806. struct MapObject *MapObjectLast = NULL;
  1807. struct MapObject *LastMapObject;
  1808. long int la[4];
  1809.  
  1810. LastMapObject = MapObject->NMapObject;
  1811.  
  1812. for(; MapObjectC > 0; MapObjectC--) {
  1813.  
  1814.     fread(la, 4, 4, fp);
  1815.     MapObject->x = la[0];
  1816.     MapObject->y = la[1];
  1817.     MapObject->z = la[2];
  1818.         MapObject->Object = &Object_;
  1819.         for(; la[3] > 0; la[3]--) {
  1820.             if( MapObject->Object->NObject == NULL )
  1821.                 break;
  1822.             MapObject->Object = MapObject->Object->NObject;
  1823.             }
  1824.         if( la[3] > 0 )
  1825.             MapObject->Object = &Object_;
  1826.         MapObject->Object->Used++;
  1827.  
  1828.     if( MapObjectC > 1 ) {
  1829.         MapObject->NMapObject = (struct MapObject *)malloc(sizeof(struct MapObject));
  1830.         if( MapObject->NMapObject == NULL ) {
  1831.             if( LastMapObject != NULL ) {
  1832.                 LastMapObject->PMapObject = MapObject;
  1833.                 MapObject->NMapObject = LastMapObject;
  1834.                 }
  1835.             else {
  1836.                 MapObject->NMapObject = NULL;
  1837.                 MapObjectLast = MapObject;
  1838.                 }
  1839.         return MapObjectLast;
  1840.         }
  1841.         MapObject->NMapObject->PMapObject = MapObject;
  1842.         MapObject = MapObject->NMapObject;
  1843.         }
  1844.     else {
  1845.         if( LastMapObject != NULL ) {
  1846.             LastMapObject->PMapObject = MapObject;
  1847.             MapObject->NMapObject = LastMapObject;
  1848.             }
  1849.         else {
  1850.             MapObject->NMapObject = NULL;
  1851.             MapObjectLast = MapObject;
  1852.             }
  1853.         }
  1854. }
  1855.  
  1856. return MapObjectLast;
  1857.  
  1858. }
  1859.  
  1860. struct MapField *LoadMapField( struct MapField *MapField, unsigned long MapFieldC, FILE *fp) {
  1861.  
  1862. struct MapField *MapFieldLast = NULL;
  1863. struct MapField *LastMapField;
  1864. long int la[4];
  1865.  
  1866. LastMapField = MapField->NMapField;
  1867.  
  1868. for(; MapFieldC > 0; MapFieldC--) {
  1869.  
  1870.     fread(la, 4, 4, fp);
  1871.     MapField->x = la[0];
  1872.     MapField->y = la[1];
  1873.     MapField->z = la[2];
  1874.         MapField->Field = &Field;
  1875.         for(; la[3] > 0; la[3]--) {
  1876.             if( MapField->Field->NField == NULL )
  1877.                 break;
  1878.             MapField->Field = MapField->Field->NField;
  1879.             }
  1880.         if( la[3] > 0 )
  1881.             MapField->Field = &Field;
  1882.         MapField->Field->Used++;
  1883.  
  1884.     if( MapFieldC > 1 ) {
  1885.         MapField->NMapField = (struct MapField *)malloc(sizeof(struct MapField));
  1886.         if( MapField->NMapField == NULL ) {
  1887.             if( LastMapField != NULL ) {
  1888.                 LastMapField->PMapField = MapField;
  1889.                 MapField->NMapField = LastMapField;
  1890.                 }
  1891.             else {
  1892.                 MapField->NMapField = NULL;
  1893.                 MapFieldLast = MapField;
  1894.                 }
  1895.         return MapFieldLast;
  1896.         }
  1897.         MapField->NMapField->PMapField = MapField;
  1898.         MapField = MapField->NMapField;
  1899.         }
  1900.     else {
  1901.         if( LastMapField != NULL ) {
  1902.             LastMapField->PMapField = MapField;
  1903.             MapField->NMapField = LastMapField;
  1904.             }
  1905.         else {
  1906.             MapField->NMapField = NULL;
  1907.             MapFieldLast = MapField;
  1908.             }
  1909.         }
  1910. }
  1911.  
  1912. return MapFieldLast;
  1913.  
  1914. }
  1915.  
  1916. struct Field *LoadField(struct Field *FieldI, unsigned long FieldC, FILE *fp) {
  1917.  
  1918. size_t w;
  1919.  
  1920. struct Field *FieldLast = NULL;
  1921. struct Field *LastField;
  1922. struct Poly3 *PolyLast3;
  1923. struct Poly4 *PolyLast4;
  1924. struct MapObject *MapObjectLast;
  1925. long int la[3];
  1926.  
  1927. LastField = FieldI->NField;
  1928.  
  1929. LastFieldNr--;
  1930.  
  1931. for(; FieldC > 0; FieldC--) {
  1932.  
  1933.     fread(FieldI->name, 26, 1, fp);
  1934.  
  1935.     w = fread(la, 4, 2, fp);
  1936.     if( w != 2 ) {
  1937.         FieldI->Poly3 = NULL;
  1938.         FieldI->PolyActive3 = NULL;
  1939.         FieldI->PolyLast3 = NULL;
  1940.         FieldI->ActivePoly3Nr = 0;
  1941.         break;
  1942.     }
  1943.     if( la[1] != 0 ) {
  1944.         if( FieldI->Poly3 == NULL ) {
  1945.             FieldI->Poly3 = FieldI->PolyActive3 = FieldI->PolyLast3 =
  1946.             ( struct Poly3 * )malloc( sizeof( struct Poly3 ) );
  1947.             if( FieldI->Poly3 == NULL ) {
  1948.                 FieldI->ActivePoly3Nr = 0;
  1949.                 goto F1;
  1950.             }
  1951.             FieldI->Poly3->PolyNext3 = NULL;
  1952.             FieldI->Poly3->PolyPrevious3 = NULL;
  1953.             }
  1954.         PolyLast3 = LoadPoly3(FieldI->PolyActive3, la[1], fp);
  1955.         if( PolyLast3 != NULL )
  1956.             FieldI->PolyLast3 = PolyLast3;
  1957.         if( FieldI->ActivePoly3Nr == 0 ) {
  1958.             FieldI->PolyActive3 = FieldI->Poly3;
  1959.             FieldI->ActivePoly3Nr = 1;
  1960.             }
  1961.         }
  1962.  
  1963. F1:    w = fread(la, 4, 2, fp);
  1964.     if( w != 2 ) {
  1965.         FieldI->Poly4 = NULL;
  1966.         FieldI->PolyActive4 = NULL;
  1967.         FieldI->PolyLast4 = NULL;
  1968.         FieldI->ActivePoly4Nr = 0;
  1969.         break;
  1970.     }
  1971.     if( la[1] != 0 ) {
  1972.         if( FieldI->Poly4 == NULL ) {
  1973.             FieldI->Poly4 = FieldI->PolyActive4 = FieldI->PolyLast4 =
  1974.             ( struct Poly4 * )malloc( sizeof( struct Poly4 ) );
  1975.             if( FieldI->Poly4 == NULL ) {
  1976.                 FieldI->ActivePoly4Nr = 0;
  1977.                 goto F2;
  1978.             }
  1979.             FieldI->Poly4->PolyNext4 = NULL;
  1980.             FieldI->Poly4->PolyPrevious4 = NULL;
  1981.             }
  1982.         PolyLast4 = LoadPoly4(FieldI->PolyActive4, la[1], fp);
  1983.         if( PolyLast4 != NULL )
  1984.             FieldI->PolyLast4 = PolyLast4;
  1985.         if( FieldI->ActivePoly4Nr == 0 ) {
  1986.             FieldI->PolyActive4 = FieldI->Poly4;
  1987.             FieldI->ActivePoly4Nr = 1;
  1988.             }
  1989.         }
  1990.  
  1991. F2:    w = fread(la, 4, 2, fp);
  1992.     if( w != 2 ) {
  1993.         FieldI->MapObject = NULL;
  1994.         FieldI->MapObjectActive = NULL;
  1995.         FieldI->MapObjectLast = NULL;
  1996.         FieldI->ActiveMapObjectNr = 0;
  1997.         break;
  1998.     }
  1999.     if( la[1] != 0 ) {
  2000.         if( FieldI->MapObject == NULL ) {
  2001.             FieldI->MapObject = FieldI->MapObjectActive = FieldI->MapObjectLast =
  2002.             ( struct MapObject * )malloc( sizeof( struct MapObject ) );
  2003.             if( FieldI->MapObject == NULL ) {
  2004.                 FieldI->ActiveMapObjectNr = 0;
  2005.                 goto F3;
  2006.             }
  2007.             FieldI->MapObject->NMapObject = NULL;
  2008.             FieldI->MapObject->PMapObject = NULL;
  2009.             }
  2010.         MapObjectLast = LoadMapObject(FieldI->MapObjectActive, la[1], fp);
  2011.         if( MapObjectLast != NULL )
  2012.             FieldI->MapObjectLast = MapObjectLast;
  2013.         if( FieldI->ActiveMapObjectNr == 0 ) {
  2014.             FieldI->MapObjectActive = FieldI->MapObject;
  2015.             FieldI->ActiveMapObjectNr = 1;
  2016.             }
  2017.         }
  2018.  
  2019. F3:    if( FieldC > 1 ) {
  2020.         FieldI->NField = (struct Field *)malloc(sizeof(struct Field));
  2021.         if( FieldI->NField == NULL ) {
  2022.             if( LastField != NULL ) {
  2023.                 LastField->PField = FieldI;
  2024.                 FieldI->NField = LastField;
  2025.                 }
  2026.             else {
  2027.                 FieldI->NField = NULL;
  2028.                 FieldLast = FieldI;
  2029.                 }
  2030.         return FieldLast;
  2031.         }
  2032.         FieldI->NField->PField = FieldI;
  2033.         FieldI = FieldI->NField;
  2034.             FieldI->Field = FieldC - 1;
  2035.             FieldI->Used = 0;
  2036.             FieldI->Poly3 = NULL;
  2037.             FieldI->Poly4 = NULL;
  2038.             FieldI->PolyActive3 = NULL;
  2039.             FieldI->PolyActive4 = NULL;
  2040.             FieldI->ActivePoly3Nr = 0;
  2041.             FieldI->PolyLast3 = NULL;
  2042.             FieldI->PolyLast4 = NULL;
  2043.             FieldI->ActivePoly4Nr = 0;
  2044.             FieldI->MapObject = NULL;
  2045.             strcpy( FieldI->name, "" );
  2046.         }
  2047.     else {
  2048.         if( LastField != NULL ) {
  2049.             LastField->PField = FieldI;
  2050.             FieldI->NField = LastField;
  2051.             }
  2052.         else {
  2053.             FieldI->NField = NULL;
  2054.             FieldLast = FieldI;
  2055.             }
  2056.         }
  2057.  
  2058. LastFieldNr++;
  2059.  
  2060. }
  2061.  
  2062. return FieldLast;
  2063.  
  2064. }
  2065.  
  2066. struct Monster *LoadMonster(struct Monster *MonsterI, unsigned long MonsterC, FILE *fp) {
  2067.  
  2068. struct Monster *MonsterLast = NULL;
  2069. struct Monster *LastMonster;
  2070.  
  2071. LastMonster = MonsterI->NMonster;
  2072.  
  2073. LastMonsterNr--;
  2074.  
  2075. for(; MonsterC > 0; MonsterC--) {
  2076.  
  2077.     fread(MonsterI->name, 26, 1, fp);
  2078.  
  2079.     if( MonsterC > 1 ) {
  2080.         MonsterI->NMonster = (struct Monster *)malloc(sizeof(struct Monster));
  2081.         if( MonsterI->NMonster == NULL ) {
  2082.             if( LastMonster != NULL ) {
  2083.                 LastMonster->PMonster = MonsterI;
  2084.                 MonsterI->NMonster = LastMonster;
  2085.                 }
  2086.             else {
  2087.                 MonsterI->NMonster = NULL;
  2088.                 MonsterLast = MonsterI;
  2089.                 }
  2090.         return MonsterLast;
  2091.         }
  2092.         MonsterI->NMonster->PMonster = MonsterI;
  2093.         MonsterI = MonsterI->NMonster;
  2094.         MonsterI->Monster = MonsterC - 1;
  2095.         MonsterI->Used = 0;
  2096.         strcpy( MonsterI->name, "" );
  2097.         }
  2098.     else {
  2099.         if( LastMonster != NULL ) {
  2100.             LastMonster->PMonster = MonsterI;
  2101.             MonsterI->NMonster = LastMonster;
  2102.             }
  2103.         else {
  2104.             MonsterI->NMonster = NULL;
  2105.             MonsterLast = MonsterI;
  2106.             }
  2107.         }
  2108.  
  2109. LastMonsterNr++;
  2110.  
  2111. }
  2112.  
  2113. return MonsterLast;
  2114.  
  2115. }
  2116.  
  2117. struct MapMonster *LoadMapMonster( struct MapMonster *MapMonster, unsigned long MapMonsterC, FILE *fp) {
  2118.  
  2119. struct MapMonster *MapMonsterLast = NULL;
  2120. struct MapMonster *LastMapMonster;
  2121. long int la[4];
  2122.  
  2123. LastMapMonster = MapMonster->NMapMonster;
  2124.  
  2125. for(; MapMonsterC > 0; MapMonsterC--) {
  2126.  
  2127.     fread(la, 4, 4, fp);
  2128.     MapMonster->x = la[0];
  2129.     MapMonster->y = la[1];
  2130.     MapMonster->z = la[2];
  2131.         MapMonster->Monster = &Monster;
  2132.         for(; la[3] > 0; la[3]--) {
  2133.             if( MapMonster->Monster->NMonster == NULL )
  2134.                 break;
  2135.             MapMonster->Monster = MapMonster->Monster->NMonster;
  2136.             }
  2137.         if( la[3] > 0 )
  2138.             MapMonster->Monster = &Monster;
  2139.         MapMonster->Monster->Used++;
  2140.  
  2141.     if( MapMonsterC > 1 ) {
  2142.         MapMonster->NMapMonster = (struct MapMonster *)malloc(sizeof(struct MapMonster));
  2143.         if( MapMonster->NMapMonster == NULL ) {
  2144.             if( LastMapMonster != NULL ) {
  2145.                 LastMapMonster->PMapMonster = MapMonster;
  2146.                 MapMonster->NMapMonster = LastMapMonster;
  2147.                 }
  2148.             else {
  2149.                 MapMonster->NMapMonster = NULL;
  2150.                 MapMonsterLast = MapMonster;
  2151.                 }
  2152.         return MapMonsterLast;
  2153.         }
  2154.         MapMonster->NMapMonster->PMapMonster = MapMonster;
  2155.         MapMonster = MapMonster->NMapMonster;
  2156.         }
  2157.     else {
  2158.         if( LastMapMonster != NULL ) {
  2159.             LastMapMonster->PMapMonster = MapMonster;
  2160.             MapMonster->NMapMonster = LastMapMonster;
  2161.             }
  2162.         else {
  2163.             MapMonster->NMapMonster = NULL;
  2164.             MapMonsterLast = MapMonster;
  2165.             }
  2166.         }
  2167. }
  2168.  
  2169. return MapMonsterLast;
  2170.  
  2171. }
  2172.  
  2173. struct Text *LoadText(struct Text *TextI, unsigned long TextC, FILE *fp) {
  2174.  
  2175. struct Text *TextLast = NULL;
  2176. struct Text *LastText;
  2177.  
  2178. LastText = TextI->NText;
  2179.  
  2180. LastTextNr--;
  2181.  
  2182. for(; TextC > 0; TextC--) {
  2183.  
  2184.     fread(TextI->name, 26, 1, fp);
  2185.  
  2186.     if( TextC > 1 ) {
  2187.         TextI->NText = (struct Text *)malloc(sizeof(struct Text));
  2188.         if( TextI->NText == NULL ) {
  2189.             if( LastText != NULL ) {
  2190.                 LastText->PText = TextI;
  2191.                 TextI->NText = LastText;
  2192.                 }
  2193.             else {
  2194.                 TextI->NText = NULL;
  2195.                 TextLast = TextI;
  2196.                 }
  2197.         return TextLast;
  2198.         }
  2199.         TextI->NText->PText = TextI;
  2200.         TextI = TextI->NText;
  2201.         strcpy( TextI->name, "" );
  2202.         TextI->Texture = TextC - 1;
  2203.         TextI->Used = 0;
  2204.         }
  2205.     else {
  2206.         if( LastText != NULL ) {
  2207.             LastText->PText = TextI;
  2208.             TextI->NText = LastText;
  2209.             }
  2210.         else {
  2211.             TextI->NText = NULL;
  2212.             TextLast = TextI;
  2213.             }
  2214.         }
  2215.  
  2216. LastTextNr++;
  2217.  
  2218. }
  2219.  
  2220. return TextLast;
  2221.  
  2222. }
  2223.  
  2224. struct Attrib *LoadAttrib(struct Attrib *AttribI, unsigned long AttribC, FILE *fp) {
  2225.  
  2226. size_t w;
  2227.  
  2228. struct Attrib *AttribLast = NULL;
  2229. struct Attrib *LastAttrib;
  2230. unsigned long int ia[9];
  2231.  
  2232. LastAttrib = AttribI->NAttrib;
  2233.  
  2234. LastAttribNr--;
  2235.  
  2236. for(; AttribC > 0; AttribC--) {
  2237.  
  2238.     w = fread(ia, 4, 9, fp);
  2239.     if( w != 9 )
  2240.     AttribI->r = ia[0];
  2241.     AttribI->g = ia[1];
  2242.     AttribI->b = ia[2];
  2243.     AttribI->Illumination = ia[3];
  2244.     AttribI->Transparency = ia[4];
  2245.     AttribI->Reflectivity = ia[5];
  2246.     AttribI->Smoothyness = ia[6];    
  2247.     AttribI->Bumpyness = ia[7];
  2248.     AttribI->Effect = ia[8];
  2249.     fread(AttribI->name, 26, 1, fp);
  2250.  
  2251.     if( AttribC > 1 ) {
  2252.         AttribI->NAttrib = (struct Attrib *)malloc(sizeof(struct Attrib));
  2253.         if( AttribI->NAttrib == NULL ) {
  2254.             if( LastAttrib != NULL ) {
  2255.                 LastAttrib->PAttrib = AttribI;
  2256.                 AttribI->NAttrib = LastAttrib;
  2257.                 }
  2258.             else {
  2259.                 AttribI->NAttrib = NULL;
  2260.                 AttribLast = AttribI;
  2261.                 }
  2262.         return AttribLast;
  2263.         }
  2264.         AttribI->NAttrib->PAttrib = AttribI;
  2265.         AttribI = AttribI->NAttrib;
  2266.         strcpy( AttribI->name, "" );
  2267.         AttribI->Attribute = AttribC - 1;
  2268.         AttribI->Used = 0;
  2269.         AttribI->r = 0;
  2270.         AttribI->g = 0;
  2271.         AttribI->b = 0;
  2272.         AttribI->Illumination = 0;
  2273.         AttribI->Transparency = 0;
  2274.         AttribI->Reflectivity = 0;
  2275.         AttribI->Smoothyness = 0;
  2276.         AttribI->Bumpyness = 0;
  2277.         AttribI->Effect = 0;
  2278.         }
  2279.     else {
  2280.         if( LastAttrib != NULL ) {
  2281.             LastAttrib->PAttrib = AttribI;
  2282.             AttribI->NAttrib = LastAttrib;
  2283.             }
  2284.         else {
  2285.             AttribI->NAttrib = NULL;
  2286.             AttribLast = AttribI;
  2287.             }
  2288.         }
  2289.  
  2290. LastAttribNr++;
  2291.  
  2292. }
  2293.  
  2294. return AttribLast;
  2295.  
  2296. }
  2297.  
  2298. struct FieldDes *LoadFieldDes(struct FieldDes *FieldDes, unsigned long FieldDesC, FILE *fp) {
  2299.  
  2300. struct FieldDes *FieldDesLast = NULL;
  2301. struct FieldDes *LastFieldDes;
  2302. long int la[11];
  2303. unsigned long int ia[9];
  2304.  
  2305. LastFieldDes = FieldDes->NFD;
  2306.  
  2307. for(; FieldDesC > 0; FieldDesC--) {
  2308.  
  2309.     fread(la, 4, 3, fp);
  2310.     
  2311.     FieldDes->x = la[0];
  2312.     FieldDes->y = la[1];
  2313.     FieldDes->z = la[2];
  2314.  
  2315.     fread(ia, 4, 9, fp);
  2316.     FieldDes->A = ia[0];
  2317.     FieldDes->B = ia[1];
  2318.     FieldDes->C = ia[2];
  2319.     FieldDes->D = ia[3];
  2320.     FieldDes->E = ia[4];
  2321.     FieldDes->F = ia[5];
  2322.     FieldDes->G = ia[6];
  2323.     FieldDes->H = ia[7];
  2324.     FieldDes->I = ia[8];
  2325.     fread(FieldDes->name, 26, 1, fp);
  2326.  
  2327.     if( FieldDesC > 1 ) {
  2328.         FieldDes->NFD = (struct FieldDes *)malloc(sizeof(struct FieldDes));
  2329.         if( FieldDes->NFD == NULL ) {
  2330.             if( LastFieldDes != NULL ) {
  2331.                 LastFieldDes->PFD = FieldDes;
  2332.                 FieldDes->NFD = LastFieldDes;
  2333.                 }
  2334.             else {
  2335.                 FieldDes->NFD = NULL;
  2336.                 FieldDesLast = FieldDes;
  2337.                 }
  2338.         return FieldDesLast;
  2339.         }
  2340.         FieldDes->NFD->PFD = FieldDes;
  2341.         FieldDes = FieldDes->NFD;
  2342.         }
  2343.     else {
  2344.         if( LastFieldDes != NULL ) {
  2345.             LastFieldDes->PFD = FieldDes;
  2346.             FieldDes->NFD = LastFieldDes;
  2347.             }
  2348.         else {
  2349.             FieldDes->NFD = NULL;
  2350.             FieldDesLast = FieldDes;
  2351.             }
  2352.         }
  2353. }
  2354.  
  2355. return FieldDesLast;
  2356.  
  2357. }
  2358.  
  2359. struct Map *LoadMap(struct Map *MapI, unsigned long MapC, FILE *fp) {
  2360.  
  2361. size_t w;
  2362.  
  2363. struct Map *MapLast = NULL;
  2364. struct Map *LastMap;
  2365. struct Field *FieldLast;
  2366. struct Object *ObjectLast;
  2367. struct Monster *MonsterLast;
  2368. struct Text *TextLast;
  2369. struct Attrib *AttribLast;
  2370. struct MapField *MapFieldLast;
  2371. struct MapObject *MapObjectLast;
  2372. struct MapMonster *MapMonsterLast;
  2373. struct FieldDes *FieldDesLast;
  2374. struct Action *ActionLast;
  2375. struct Poly3 *PolyLast3;
  2376. struct Poly4 *PolyLast4;
  2377. long int la[3];
  2378.  
  2379. LastMap = MapI->NMap;
  2380.  
  2381.     w = fread(la, 4, 2, fp);
  2382.     FieldLast = LoadField(&Field, la[1], fp);
  2383.     if( FieldLast != NULL )
  2384.         LastField = FieldLast;
  2385.  
  2386.     w = fread(la, 4, 2, fp);
  2387.     ObjectLast = LoadObject(&Object_, la[1], fp);
  2388.     if( ObjectLast != NULL )
  2389.         LastObject = ObjectLast;
  2390.  
  2391.     w = fread(la, 4, 2, fp);
  2392.     MonsterLast = LoadMonster(&Monster, la[1], fp);
  2393.     if( MonsterLast != NULL )
  2394.         LastMonster = MonsterLast;
  2395.  
  2396.     w = fread(la, 4, 2, fp);
  2397.     TextLast = LoadText(&Texture, la[1], fp);
  2398.     if( TextLast != NULL )
  2399.         LastText = TextLast;
  2400.  
  2401.     w = fread(la, 4, 2, fp);
  2402.     AttribLast = LoadAttrib(&Attribute, la[1], fp);
  2403.     if( AttribLast != NULL )
  2404.         LastAttrib = AttribLast;
  2405.  
  2406. LastMapNr--;
  2407.  
  2408. for(; MapC > 0; MapC--) {
  2409.  
  2410.     fread(MapI->name, 26, 1, fp);
  2411.  
  2412.     fread(la, 4, 3, fp);
  2413.  
  2414.     MapI->x = la[0];
  2415.     MapI->y = la[1];
  2416.     MapI->z = la[2];
  2417.  
  2418.     w = fread(la, 4, 2, fp);
  2419.     if( w != 2 ) {
  2420.         MapI->Poly3 = NULL;
  2421.         MapI->PolyActive3 = NULL;
  2422.         MapI->PolyLast3 = NULL;
  2423.         MapI->ActivePoly3Nr = 0;
  2424.         break;
  2425.     }
  2426.     if( la[1] != 0 ) {
  2427.         if( MapI->Poly3 == NULL ) {
  2428.             MapI->Poly3 = MapI->PolyActive3 = MapI->PolyLast3 =
  2429.             ( struct Poly3 * )malloc( sizeof( struct Poly3 ) );
  2430.             if( MapI->Poly3 == NULL ) {
  2431.                 MapI->ActivePoly3Nr = 0;
  2432.                 goto M1;
  2433.             }
  2434.             MapI->Poly3->PolyNext3 = NULL;
  2435.             MapI->Poly3->PolyPrevious3 = NULL;
  2436.             }
  2437.         PolyLast3 = LoadPoly3(MapI->PolyActive3, la[1], fp);
  2438.         if( PolyLast3 != NULL )
  2439.             MapI->PolyLast3 = PolyLast3;
  2440.         if( MapI->ActivePoly3Nr == 0 ) {
  2441.             MapI->PolyActive3 = MapI->Poly3;
  2442.             MapI->ActivePoly3Nr = 1;
  2443.             }
  2444.         }
  2445.  
  2446. M1:    w = fread(la, 4, 2, fp);
  2447.     if( w != 2 ) {
  2448.         MapI->Poly4 = NULL;
  2449.         MapI->PolyActive4 = NULL;
  2450.         MapI->PolyLast4 = NULL;
  2451.         MapI->ActivePoly4Nr = 0;
  2452.         break;
  2453.     }
  2454.     if( la[1] != 0 ) {
  2455.         if( MapI->Poly4 == NULL ) {
  2456.             MapI->Poly4 = MapI->PolyActive4 = MapI->PolyLast4 =
  2457.             ( struct Poly4 * )malloc( sizeof( struct Poly4 ) );
  2458.             if( MapI->Poly4 == NULL ) {
  2459.                 MapI->ActivePoly4Nr = 0;
  2460.                 goto M2;
  2461.             }
  2462.             MapI->Poly4->PolyNext4 = NULL;
  2463.             MapI->Poly4->PolyPrevious4 = NULL;
  2464.             }
  2465.         PolyLast4 = LoadPoly4(MapI->PolyActive4, la[1], fp);
  2466.         if( PolyLast4 != NULL )
  2467.             MapI->PolyLast4 = PolyLast4;
  2468.         if( MapI->ActivePoly4Nr == 0 ) {
  2469.             MapI->PolyActive4 = MapI->Poly4;
  2470.             MapI->ActivePoly4Nr = 1;
  2471.             }
  2472.         }
  2473.  
  2474. M2:    w = fread(la, 4, 2, fp);
  2475.     if( w != 2 ) {
  2476.         MapI->MapField = NULL;
  2477.         MapI->MapFieldActive = NULL;
  2478.         MapI->MapFieldLast = NULL;
  2479.         MapI->ActiveMapFieldNr = 0;
  2480.         break;
  2481.     }
  2482.     if( la[1] != 0 ) {
  2483.         if( MapI->MapField == NULL ) {
  2484.             MapI->MapField = MapI->MapFieldActive = MapI->MapFieldLast =
  2485.             ( struct MapField * )malloc( sizeof( struct MapField ) );
  2486.             if( MapI->MapField == NULL ) {
  2487.                 MapI->ActiveMapFieldNr = 0;
  2488.                 goto M3;
  2489.             }
  2490.             MapI->MapField->NMapField = NULL;
  2491.             MapI->MapField->PMapField = NULL;
  2492.             }
  2493.         MapFieldLast = LoadMapField(MapI->MapFieldActive, la[1], fp);
  2494.         if( MapFieldLast != NULL )
  2495.             MapI->MapFieldLast = MapFieldLast;
  2496.         if( MapI->ActiveMapFieldNr == 0 ) {
  2497.             MapI->MapFieldActive = MapI->MapField;
  2498.             MapI->ActiveMapFieldNr = 1;
  2499.             }
  2500.         }
  2501.  
  2502. M3:    w = fread(la, 4, 2, fp);
  2503.     if( w != 2 ) {
  2504.         MapI->MapObject = NULL;
  2505.         MapI->MapObjectActive = NULL;
  2506.         MapI->MapObjectLast = NULL;
  2507.         MapI->ActiveMapObjectNr = 0;
  2508.         break;
  2509.     }
  2510.     if( la[1] != 0 ) {
  2511.         if( MapI->MapObject == NULL ) {
  2512.             MapI->MapObject = MapI->MapObjectActive = MapI->MapObjectLast =
  2513.             ( struct MapObject * )malloc( sizeof( struct MapObject ) );
  2514.             if( MapI->MapObject == NULL ) {
  2515.                 MapI->ActiveMapObjectNr = 0;
  2516.                 goto M4;
  2517.             }
  2518.             MapI->MapObject->NMapObject = NULL;
  2519.             MapI->MapObject->PMapObject = NULL;
  2520.             }
  2521.         MapObjectLast = LoadMapObject(MapI->MapObjectActive, la[1], fp);
  2522.         if( MapObjectLast != NULL )
  2523.             MapI->MapObjectLast = MapObjectLast;
  2524.         if( MapI->ActiveMapObjectNr == 0 ) {
  2525.             MapI->MapObjectActive = MapI->MapObject;
  2526.             MapI->ActiveMapObjectNr = 1;
  2527.             }
  2528.         }
  2529.  
  2530. M4:    w = fread(la, 4, 2, fp);
  2531.     if( w != 2 ) {
  2532.         MapI->MapMonster = NULL;
  2533.         MapI->MapMonsterActive = NULL;
  2534.         MapI->MapMonsterLast = NULL;
  2535.         MapI->ActiveMapMonsterNr = 0;
  2536.         break;
  2537.     }
  2538.     if( la[1] != 0 ) {
  2539.         if( MapI->MapMonster == NULL ) {
  2540.             MapI->MapMonster = MapI->MapMonsterActive = MapI->MapMonsterLast =
  2541.             ( struct MapMonster * )malloc( sizeof( struct MapMonster ) );
  2542.             if( MapI->MapMonster == NULL ) {
  2543.                 MapI->ActiveMapMonsterNr = 0;
  2544.                 goto M5;
  2545.             }
  2546.             MapI->MapMonster->NMapMonster = NULL;
  2547.             MapI->MapMonster->PMapMonster = NULL;
  2548.             }
  2549.         MapMonsterLast = LoadMapMonster(MapI->MapMonsterActive, la[1], fp);
  2550.         if( MapMonsterLast != NULL )
  2551.             MapI->MapMonsterLast = MapMonsterLast;
  2552.         if( MapI->ActiveMapMonsterNr == 0 ) {
  2553.             MapI->MapMonsterActive = MapI->MapMonster;
  2554.             MapI->ActiveMapMonsterNr = 1;
  2555.             }
  2556.         }
  2557.  
  2558. M5:    w = fread(la, 4, 2, fp);
  2559.     if( w != 2 ) {
  2560.         MapI->FieldDes = NULL;
  2561.         MapI->FieldDesActive = NULL;
  2562.         MapI->FieldDesLast = NULL;
  2563.         MapI->ActiveFieldDesNr = 0;
  2564.         break;
  2565.     }
  2566.     if( la[1] != 0 ) {
  2567.         if( MapI->FieldDes == NULL ) {
  2568.             MapI->FieldDes = MapI->FieldDesActive = MapI->FieldDesLast =
  2569.             ( struct FieldDes * )malloc( sizeof( struct FieldDes ) );
  2570.             if( MapI->FieldDes == NULL ) {
  2571.                 MapI->ActiveFieldDesNr = 0;
  2572.                 goto M6;
  2573.             }
  2574.             MapI->FieldDes->NFD = NULL;
  2575.             MapI->FieldDes->PFD = NULL;
  2576.             }
  2577.         FieldDesLast = LoadFieldDes(MapI->FieldDesActive, la[1], fp);
  2578.         if( FieldDesLast != NULL )
  2579.             MapI->FieldDesLast = FieldDesLast;
  2580.         if( MapI->ActiveFieldDesNr == 0 ) {
  2581.             MapI->FieldDesActive = MapI->FieldDes;
  2582.             MapI->ActiveFieldDesNr = 1;
  2583.             }
  2584.         }
  2585.  
  2586. M6:    w = fread(la, 4, 2, fp);
  2587.     if( w != 2 ) {
  2588.         MapI->Action = NULL;
  2589.         MapI->ActionActive = NULL;
  2590.         MapI->ActionLast = NULL;
  2591.         MapI->ActiveActionNr = 0;
  2592.         break;
  2593.     }
  2594.     if( la[1] != 0 ) {
  2595.         if( MapI->Action == NULL ) {
  2596.             MapI->Action = MapI->ActionActive = MapI->ActionLast =
  2597.             ( struct Action * )malloc( sizeof( struct Action ) );
  2598.             if( MapI->Action == NULL ) {
  2599.                 MapI->ActiveActionNr = 0;
  2600.                 goto M7;
  2601.             }
  2602.             MapI->Action->ActionNext = NULL;
  2603.             MapI->Action->ActionPrevious = NULL;
  2604.             }
  2605.         ActionLast = LoadAction(MapI->ActionActive, la[1], MapI->MapObject, fp);
  2606.         if( ActionLast != NULL )
  2607.             MapI->ActionLast = ActionLast;
  2608.         if( MapI->ActiveActionNr == 0 ) {
  2609.             MapI->ActionActive = MapI->Action;
  2610.             MapI->ActiveActionNr = 1;
  2611.             }
  2612.         }
  2613.  
  2614. M7:    if( MapC > 1 ) {
  2615.         MapI->NMap = (struct Map *)malloc(sizeof(struct Map));
  2616.         if( MapI->NMap == NULL ) {
  2617.             if( LastMap != NULL ) {
  2618.                 LastMap->PMap = MapI;
  2619.                 MapI->NMap = LastMap;
  2620.                 }
  2621.             else {
  2622.                 MapI->NMap = NULL;
  2623.                 MapLast = MapI;
  2624.                 }
  2625.         return MapLast;
  2626.         }
  2627.         MapI->NMap->PMap = MapI;
  2628.         MapI = MapI->NMap;
  2629.         MapI->Poly3 = NULL;
  2630.         MapI->Poly4 = NULL;
  2631.         MapI->PolyActive3 = NULL;
  2632.         MapI->PolyActive4 = NULL;
  2633.         MapI->ActivePoly3Nr = 0;
  2634.         MapI->PolyLast3 = NULL;
  2635.         MapI->PolyLast4 = NULL;
  2636.         MapI->ActivePoly4Nr = 0;
  2637.         MapI->x = 0;
  2638.         MapI->y = 0;
  2639.         MapI->z = 0;
  2640.         MapI->MapField = NULL;
  2641.         MapI->MapObject = NULL;
  2642.         MapI->MapMonster = NULL;
  2643.         MapI->Action = NULL;
  2644.         MapI->FieldDes = NULL;
  2645.         MapI->MapFieldActive = NULL;
  2646.         MapI->MapFieldLast = NULL;
  2647.         MapI->ActiveMapFieldNr = 0;
  2648.         MapI->MapObjectActive = NULL;
  2649.         MapI->MapObjectLast = NULL;
  2650.         MapI->ActiveMapObjectNr = 0;
  2651.         MapI->MapMonsterActive = NULL;
  2652.         MapI->MapMonsterLast = NULL;
  2653.         MapI->ActiveMapMonsterNr = 0;
  2654.         MapI->FieldDesActive = NULL;
  2655.         MapI->FieldDesLast = NULL;
  2656.         MapI->ActiveFieldDesNr = 0;
  2657.         MapI->ActionActive = NULL;
  2658.         MapI->ActionLast = NULL;
  2659.         MapI->ActiveActionNr = 0;
  2660.         strcpy( MapI->name, "" );
  2661.         }
  2662.     else {
  2663.         if( LastMap != NULL ) {
  2664.             LastMap->PMap = MapI;
  2665.             MapI->NMap = LastMap;
  2666.             }
  2667.         else {
  2668.             MapI->NMap = NULL;
  2669.             MapLast = MapI;
  2670.             }
  2671.         }
  2672.  
  2673. LastMapNr++;
  2674.  
  2675. }
  2676.  
  2677. return MapLast;
  2678.  
  2679. }
  2680.  
  2681. /* END OF LOAD FUNCTIONS */
  2682.  
  2683. --
  2684.  
  2685. Version information:
  2686.  
  2687. This is version 1.01 of Fictive Map Maker by Valentin 'Slash' Asler / FVR.
  2688. Some functions are not yet finished and will proboably soon be added and
  2689. others enhanced.
  2690.